Изучите клиент Feign и другие полезные библиотеки
Были ли у вас проблемы с отправкой HTTP-запроса к нескольким различным интерфейсам программирования приложений (API)? Не было бы проще объединить только то, что вам нужно из этих разных API, в один API?
Создание промежуточного программного обеспечения может решить эту проблему. Промежуточное программное обеспечение программного приложения позволяет нам иметь единый настраиваемый источник данных. Одним из основных преимуществ промежуточного программного обеспечения является то, что оно объединяет множество различных продуктов и услуг в общую систему. Итак, что такое промежуточное ПО? Согласно Microsoft Azure, промежуточное ПО - это программное обеспечение, работающее как скрытый слой трансляции между операционной системой и приложением, работающим на ней. Он обеспечивает управление данными и обмен данными для распределенных приложений.
В этой статье я продемонстрирую, как создать промежуточное ПО с помощью Spring Boot с помощью некоторых зависимостей, таких как Feign client. Feign - это декларативный веб-сервис, созданный Netflix, который обеспечивает высокую степень абстракции для выполнения вызовов API передачи репрезентативного состояния (REST). Точно так же он устраняет необходимость писать базовые коды HTTP-запросов, одновременно обеспечивая эффективность и аккуратность исходного кода.
Для простоты мы будем звонить в единую поддельную онлайн-службу REST API, используемую для тестирования и создания прототипов, под названием JSONPlaceholder. Посетите https://jsonplaceholder.typicode.com/, чтобы увидеть различные доступные маршруты. В этом упражнении я буду использовать маршрут todo.
В конце этой статьи читатель должен понять, что такое промежуточное ПО, а также знать, когда и как его использовать. Точно так же они должны ознакомиться с клиентом веб-службы Feign.
Если вы новичок в Spring или просто нуждаетесь в обновлении, обратитесь к этой статье, в которой объясняются несколько основных концепций.
Начнем!
Во-первых, нам нужно создать проект Spring Boot. Для этого воспользуемся Spring Initializr. На скриншоте ниже показаны конфигурации и зависимости, которые мы будем использовать. А пока давайте оставим это простым, используя только веб-зависимость Spring. Мы будем добавлять все остальные зависимости для нашего проекта вручную по мере продвижения. После нажатия кнопки Создать будет загружена zip-папка. Извлеките содержимое, затем откройте проект в среде IDE. Я буду использовать IDE IntelliJ.

Знакомство с данными
Как указывалось ранее, мы будем использовать поддельный онлайн-API REST под названием JSONPlaceHolder. У этого онлайн-API есть ресурсы, такие как сообщения, задачи и комментарии, и это лишь некоторые из них. Мы будем использовать ресурс todos для этого проекта. На изображениях ниже показаны различные HTTP-запросы и ответы на ресурс todos с использованием Postman:



Начнем кодирование!
Сначала мы создадим класс для моделирования данных, возвращаемых API. Чтобы сохранить элегантность в структуре нашего проекта, мы создадим папку с именем Model, которая будет содержать наш класс. Мы назовем класс Todo, и у него будет четыре атрибута:
private Integer userIdprivate Integer idprivate String titleprivate Boolean completed

Приведенная выше аннотация @Data исходит из зависимости Lombok, которую мы вручную добавили и импортировали, как показано выше. Эта библиотека позволяет сократить общий Java-код, написанный для классов. Аннотация @Data автоматически генерирует сеттеры, геттеры, toStrings и т. Д. Для класса Todo. По сути, Lombok упрощает процесс создания простого старого объекта Java (POJO).
Создание интерфейса фальшивого клиента
Давайте сначала сохраним базовый URL поддельного REST API в нашем application.properties файле. Пример показан ниже:

Следующим шагом является создание пакета (папки) с именем Client, который будет содержать наш клиентский интерфейс Feign. Мы создадим три конечные точки. Первый будет использоваться для получения всех задач, второй будет использоваться для получения одной задачи, указав число в качестве переменной пути в URL-адресе, а третий будет почтовым запросом, который принимает объект задачи в качестве тела запроса для создать задачу.

Давайте немного сосредоточимся на Feign, как показано на GIF-изображении выше. Аннотация Feign может принимать несколько параметров, таких как имя, значение, URL-адрес и конфигурация. Однако имя или значение должны быть одним из предоставленных параметров. Параметр URL-адреса будет базовым URL-адресом, который хранится в нашем application.properties файле, и клиент Feign будет делать к нему свои HTTP-запросы. Обратите внимание, что если API требует какой-либо формы аутентификации, мы могли бы создать класс конфигурации для ресурса API, который будет обрабатывать аутентификацию, а затем предоставить этот класс в качестве значения для аргумента конфигурации. Например, присваиваем configuration = JSONPlaceHolderConfig.class.
Аннотация GetMapping выполняет HTTP-запрос GET на основе предоставленного URL-адреса. Обратите внимание, что URL-адрес, предоставленный этой аннотации, в сочетании с базовым URL-адресом, который был передан клиенту Feign, становится фактической конечной точкой ресурса REST API. Интерфейс имеет два метода запроса на получение: один, который вернет все задачи, и другой, который вернет одну задачу с учетом предоставленной переменной пути. Метод POST принимает тело запроса типа Todo и позволяет выполнить HTTP-запрос POST с указанной конечной точкой.
Создание службы
Придерживаясь принципа разделения задач, мы создадим пакет с именем Service, который содержит наш класс обслуживания (TodoService). Сервис использует методы, которые были объявлены ранее в клиентском интерфейсе Feign.
Давайте немного переварим код.
Аннотация @Service является частью большой аннотации @Component, которая также включает аннотацию @Controller. В аннотации @Service наш класс TodoService объявляется как компонент Spring, так что он может поддерживаться контекстом приложения Spring. Эта аннотация отмечает наш класс TodoService как уровень сервиса, который содержит бизнес-логику нашего приложения.
Кроме того, для этой реализации может быть очень полезно ведение журнала - особенно при отладке или для незначительного аудита. Аннотация @Slf4j (Simple Logging Facade для Java) является частью библиотеки Lombok и позволяет нам легко записывать информацию в консоль с помощью метода log.info().
Третья аннотация, @Autowired, устраняет необходимость в установщиках, геттерах и конструкторах за счет внедрения зависимостей. Это делается путем вставки объектов в другие объекты, что приводит к ослаблению связи компонентов. В результате нам не нужно создавать экземпляр клиентского интерфейса Feign.
Создание контроллера
Внешний мир связывается с классом контроллера с помощью HTTP-запроса. Это точка входа для нашего приложения Spring Boot. Когда мы будем делать HTTP-запрос к нашему приложению в будущем, он будет напрямую к классу контроллера, где выполняется сопоставление запросов для идентификации и вызова желаемых методов.
Суть выше демонстрирует класс контроллера, расположенный в пакете Controller. Заметили что-нибудь новое? Три аннотации, использованные выше, не являются обязательными, а являются личным предпочтением. Они гарантируют, что мне не придется писать лишние строки кода.
Давайте кратко рассмотрим аннотацию @RestController. @RestController - это комбинация аннотаций @Controller и @ResponseBody. По умолчанию аннотация @RestController выполняет сканирование и обнаружение методов сопоставления (функция аннотации @Controller). Он также автоматически сериализует объекты (данные), возвращаемые методами в классе контроллера, в JSON, который сформирует тело ответа HTTP (функция @ResponseBody).
Кроме того, аннотация @RequestMapping довольно проста. Он сопоставляет HTTP-запрос с различными методами и классами. Добавление аннотации @RequestMapping к определению нашего класса гарантирует, что базовым URL-адресом нашего контроллера будет любое значение, которое мы передаем в качестве аргумента указанной аннотации (в данном случае todo-list).
Аннотация @RequiredArgsConstructor из библиотеки Lombok очень полезна. Конструкторы иногда могут запутать нас с помощью большого количества строк кода. @RequiredArgsConstructor создает конструкторы для любых предоставленных полей класса, которые объявлены с помощью последнего ключевого слова (например, private final TodoService todoService).
Определенные методы в классе контроллера используют соответствующую бизнес-логику, предоставляемую уровнем обслуживания, нашим классом обслуживания. Каждый метод сопоставляется с указанным URL-адресом (конечной точкой) и возвращает ответ от указанного метода службы.
Готово!
Как вы думаете, наше приложение будет работать должным образом, если мы его запустим? Ну нет. Почему нет? Причина проста в том, что мы не включили Feign в основном классе нашего приложения. Мы можем добиться успеха, просто аннотируя наш основной класс с помощью @EnableFeignClients. Эта аннотация отвечает за сканирование всех заявленных клиентских интерфейсов Feign.

Следующие изображения демонстрируют использование Postman (клиента) для связи с различными маршрутами в нашем промежуточном приложении.



Заключение
Вот и все: мы сделали функциональное приложение, которое упрощает общение с помощью HTTP-запросов. Теперь мы можем общаться с поддельным онлайн-REST API через наше приложение. Приложение, по сути, является посредником между клиентом (Postman) и поддельным REST API, выполняя одну из определенных ролей промежуточного программного обеспечения.
Это текущее приложение включает только одну службу API, но может взаимодействовать со многими различными службами, предоставляющими данные. В следующий раз, когда вам придется использовать много разных источников данных, промежуточное ПО может облегчить вашу жизнь, особенно с использованием таких библиотек, как Feign и Lombok.