Вступление
Весной 5 был представлен новый реактивный веб-клиент, называемый веб-клиентом. В этом посте я покажу, когда и как мы можем использовать веб-клиент Spring против RestTemplate. Я также опишу, какие функции предлагает веб-клиент.
Что такое RestTemplate?
RestTemplate – это центральный класс Spring, который обеспечивает HTTP-доступ со стороны клиента. RestTemplate предлагает HTTP-методы POST, GET, PUT, DELETE, HEAD и OPTIONS. Простой вариант использования RestTemplate заключается в использовании веб-служб Restful.
Вы можете создать компонент, который предоставляет экземпляр RestTemplate. Затем вы можете @autowire
этот компонент в любом классе, в котором вы планируете вызывать службы REST. RestTemplate – это класс, реализующий интерфейс Операции по Отдыху
.
Следующий код показывает объявление компонента:
@Bean public RestOperations restOperations() { return new RestTemplate(); }
В следующем коде показан клиент REST Клиент Yelp
вызов REST API Yelp для получения отзывов об аренде недвижимости.
@Autowired private final RestOperations restOperations; public List getRentalPropertyReviews(String address) { String url = buildRestUrl(businessId); HttpHeaders httpHeaders = new HttpHeaders(); String apiKey = getApiKey(YELP); httpHeaders.add("Authorization","Bearer " + apiKey); httpHeaders.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity("parameters", httpHeaders); ResponseEntity response; try { response = restOperations.exchange(url, HttpMethod.GET,entity, String.class); } catch(RestClientException e) { throw new RuntimeException("Unable to retrieve reviews", e); } }
В приведенном выше коде мы создаем заголовки HTTP, добавляя ключ API REST Yelp как часть авторизации. Мы вызываем метод GET, чтобы получить данные обзора.
В принципе, нужно сделать
- Автоматическое подключение объекта RestTemplate
- Создавайте HTTP-заголовки с авторизацией и типом контента
- Используйте HttpEntity для обертывания объекта запроса
- Укажите URL-адрес, метод Http и тип возвращаемого значения для метода exchange.
Что такое Веб-клиент?
Весной 5 был представлен реактивный веб-клиент, называемый веб-клиентом. Это интерфейс для выполнения веб-запросов. Это часть реактивного модуля Spring web. Веб-клиент в конечном итоге заменит RestTemplate.
Самое главное, что веб-клиент является реактивным, неблокирующим, асинхронным и работает по протоколу HTTP Http/1.1.
Чтобы использовать WebClient, нужно сделать
- Создайте экземпляр WebClient
- Сделайте запрос к конечной точке REST
- Обработайте ответ
WebClient webClient = WebClient .builder() .baseUrl("https://localhost:8443") .defaultCookie("cookieKey", "cookieValue") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .defaultUriVariables(Collections.singletonMap("url", "https://localhost:8443")) .build();
Приведенный выше код показывает один из способов создания экземпляра веб-клиента. Вы также можете создать экземпляр, просто используя WebClient.create();
Веб-клиент предоставляет два метода обмена
и извлекать
. метод exchange обычно извлекает ответ вместе со статусом и заголовками. метод извлечения получает тело ответа напрямую. Это проще в использовании.
Также в зависимости от того, пытаетесь ли вы получить в ответ один объект или список объектов, вы можете использовать mono
или поток
.
this.webClient = webClientBuilder.baseUrl("http://localhost:8080/v1/betterjavacode/").build(); this.webClient.get() .uri("users") .accept(MediaType.APPLICATION_JSON) .retrieve().bodyToFlux(UserDto.class).collectList();
Приведенный выше код в основном использует WebClient
для получения списка пользователей из REST API.
Весенний веб-клиент против RestTemplate
Мы уже знаем одно ключевое различие между этими двумя функциями. Веб-клиент является неблокирующим клиентом, а RestTemplate – блокирующим клиентом.
RestTemplate использует API сервлетов Java под капотом. API сервлета – это синхронный вызывающий объект. Поскольку он синхронный, поток будет блокироваться до тех пор, пока webclient не ответит на запрос.
Следовательно, количество запросов, ожидающих результатов, будет увеличиваться. Это приведет к увеличению объема памяти.
С другой стороны, веб-клиент является асинхронным неблокирующим клиентом. Он использует реактивный каркас пружины под капотом. Веб-клиент является частью модуля Spring-Web Flux.
Spring WebFlux использует библиотеку реакторов . Он предоставляет API Mono и Flux для работы с последовательностями данных. Реактор – это библиотека реактивных потоков. И все его операторы поддерживают неблокирующее обратное давление.
Пример использования WebClient в приложении Spring Boot
Мы можем объединить возможности Spring Web MVC и Spring Web Flux. В этом разделе я создам образец приложения. Это приложение вызовет REST API с помощью Web Flux, и мы создадим ответ, чтобы показать веб-страницу со списком пользователей.
RestController
для этого примера используется API для получения списка пользователей:
package com.betterjavacode.webclientdemo.controllers; import com.betterjavacode.webclientdemo.dto.UserDto; import com.betterjavacode.webclientdemo.managers.UserManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("v1/betterjavacode") public class UserController { @Autowired public UserManager userManager; @GetMapping(value = "/users") public List getUsers() { return userManager.getAllUsers(); } }
Контроллер
класс, который использует WebClient для вызова REST API, выглядит следующим образом:
package com.betterjavacode.webclientdemo.controllers; import com.betterjavacode.webclientdemo.clients.UserClient; import com.betterjavacode.webclientdemo.dto.UserDto; import com.betterjavacode.webclientdemo.managers.UserManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.util.List; @Controller public class MainController { @Autowired UserClient userClient; @GetMapping(value = "/") public String home() { return "home"; } @GetMapping(value = "/users") public String getUsers(Model model) { List users = userClient.getUsers().block(); model.addAttribute("userslist", users); return "users"; } }
Теперь важный фрагмент кода пользовательского клиента – это то, где мы будем использовать WebClient для вызова REST API.
package com.betterjavacode.webclientdemo.clients; import com.betterjavacode.webclientdemo.dto.UserDto; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.List; @Service public class UserClient { private WebClient webClient; public UserClient(WebClient.Builder webClientBuilder) { this.webClient = webClientBuilder.baseUrl("http://localhost:8080/v1/betterjavacode/").build(); } public MonogetUsers() { return this.webClient.get() .uri("users") .accept(MediaType.APPLICATION_JSON) .retrieve().bodyToFlux(UserDto.class).collectList(); } }
Приведенный выше код показывает, как сначала создается веб-клиент, а затем используется для получения
ответа от REST API. метод извлечения предлагает два варианта моно или потока. Поскольку у нас есть более одного пользователя, мы используем flux.
Это показывает, что мы можем использовать реактивный, неблокирующий веб-клиент, который является частью WebFlux в Spring Web MVC framework.
Что Еще есть в веб-клиенте Spring?
Веб-клиент Spring является частью Spring Web Flux
фреймворка. Основное преимущество этого API заключается в том, что разработчику не нужно беспокоиться о параллелизме или потоках. Веб-клиент позаботится об этом.
Веб-клиент имеет встроенную поддержку клиентской библиотеки HTTP для выполнения запросов. Это включает в себя httpкомпоненты Apache, Реактивный HttpClient Jetty или реакторную сетку.
Веб-клиент.конструктор()
предлагает следующие опции:
uriBuilderFactory
– настроенный uriBuilderFactory для использования базового URL-адреса Defaultheader
– Заголовки для каждого запроса файл Cookie по умолчанию
– Файлы cookie для каждого запроса запрос по умолчанию
– Настроить каждый запрос фильтр
– Фильтр клиентов для каждого запроса Стратегии обмена
– Настройки чтения/записи HTTP-сообщений Я уже показывал метод извлечения
в приведенной выше демонстрации кода.
Веб-клиент также предлагает метод обмена
с такими вариантами, как обмен на Mono и
обмен на Flux”.
С помощью атрибута()
мы также можем добавить атрибуты в запрос.
В качестве альтернативы можно также использовать WebClient для синхронного использования. В моем примере выше основного контроллера я использую блок
для получения конечного результата. Это в основном блокирует параллельные вызовы, пока мы не получим результат.
Одной из ключевых функций, предлагаемых веб-клиентом, является retryWhen()
. Для более устойчивой системы это отличная функция, которую вы можете добавить при использовании WebClient.
webClient .get() .uri(String.join("", "/users", id)) .retrieve() .bodyToMono(UserDto.class) .retryWhen(Retry.fixedDelay(5, Duration.ofMillis(100))) .block();
Повторите, когда
принимает класс повтора в качестве параметра.
Веб-клиент также предлагает функцию обработки ошибок. do On Error()
позволяет обработать ошибку. Он срабатывает, когда моно заканчивается ошибкой. при ошибке Resume()
является резервным вариантом, основанным на ошибке.
Вывод
В этом посте я показал, что такое Spring WebClient, как мы можем использовать Spring Web Client против RestTemplate и какие различные функции он предлагает.
Оригинал: “https://dev.to/betterjavacode/spring-webclient-vs-resttemplate-comparison-and-features-3cgp”