[Перевод] Spring Boot 3.2: замените свой RestTemplate на RestClient

540104ceb3ffe50eab28309cd020f1ab.jpeg

От переводчика

Сообщество Spring АйО представляет перевод статьи сравнения двух подходов взаимодействия с RESTful сервисами в Spring Boot: с помощью устаревшего RestTemplate, и нового RestClient. Последний является надстройкой над WebClient, и предоставляет более удобный интерфейс, появившийся в Spring Boot 3.2. Статья представляет собой достаточно поверхностное сравнение двух подходов, которое, тем не менее, дает неплохое представление о новом API.

В мире Spring Boot отправка HTTP запросов к внешним сервисам является весьма распространенной задачей. Традиционно при достижении этой цели разработчики полагались на RestTemplate. Однако, по мере развития Spring Framework, на свет появился новый и более мощный способ обработки HTTP запросов: так называемый WebClient. Spring Boot 3.2 представил нам надстройку над WebClient, которая получила название RestClient. 

RestClient предлагает нам более современные и интуитивно понятные способы взаимодействия с RESTful сервисами. 

Происхождение RestTemplate

RestTemplate является одним из основных элементов экосистемы Spring на протяжении многих лет. Это синхронный клиент, предназначенный для отправки HTTP запросов и обработки ответов. Используя RestTemplate, разработчики могут легко взаимодействовать с RESTful API, используя знакомый синтаксис Java. Однако по мере того, как приложения становились более асинхронными и неблокирующими, ограничения, налагаемые RestTemplate, становились все более очевидными. 

Ниже приведен простейший пример использования RestTemplate для загрузки данных из внешнего API:  

var restTemplate = new RestTemplate(); 

var response = restTemplate.getForObject(
  "https://api.example.com/data", 
  String.class
); 

System.out.println(response);

Появление WebClient

С приходом Spring WebFlux, асинхронного, неблокирующего веб-фреймворка, на свет появляется WebClient как современная альтернатива RestTemplate. WebClient  соответствует принципам реактивности и идеально подходит для разработки реактивных приложений. Он поддерживает как синхронную, так и асинхронную коммуникацию, одновременно с этим предлагая нам fluent API для составления запросов.

Ниже приведен пример использования WebClient для выполнения того же HTTP запроса, что и в предыдущем примере:

var webClient = WebClient.create(); 

var response = webClient.get()
  .uri("https://api.example.com/data") 
  .retrieve()
  .bodyToMono(String.class); 

 response.subscribe(System.out::println);

RestClient в Spring Boot 3.2

Релиз Spring Boot 3.2 включил в себя появление RestClient, высокоуровневой абстракции WebClient. RestClient еще больше упрощает процесс отправки HTTP запросов, предлагая более интуитивный fluent API, меньшее количество шаблонного кода, сохраняя при этом все возможности WebClient:

Давайте посмотрим на пример того, как может использоваться RestClient:

var response = restClient 
  .get() 
  .uri(cepURL) 
  .retrieve() 
  .toEntity(String.class); 
 
System.out.println(response.getBody());

С RestClient код становится более лаконичным и легким к прочтению. RestClient самостоятельно управляет созданием экземпляров WebClient, избавляя разработчика от необходимости настройки HTTP клиентов. 

Сравнение RestClient с RestTemplate

Давайте сравним RestClient с RestTemplate, на примере часто встречающихся сценариев:

Инициализация объекта

RestTemplate:

var response = new RestTemplate();

RestClient:

var response = RestClient.create();

Мы также можем использовать RestTemplate для создания RestClient:

var myOldRestTemplate = new RestTemplate();             
var response = RestClient.builder(myOldRestTemplate);

GET  запрос

RestTemplate:

var response = restTemplate.getForObject(
  "https://api.example.com/data", 
  String.class
); 

RestClient:

var response = restClient 
  .get() 
  .uri(cepURL) 
  .retrieve() 
  .toEntity(String.class);

POST запрос

RestTemplate:

ResponseEntity response = restTemplate.postForEntity(
  "https://api.example.com/data", 
  request, 
  String.class
); 

RestClient:  

var response = restClient 
  .post() 
  .uri("https://api.example.com/data") 
  .body(request) 
  .retrieve() 
  .toEntity(String.class);  

Обработка ошибок

RestTemplate:

try { 
  String response = restTemplate.getForObject( 
    "https://api.example.com/data",  
    String.class 
  ); 
} catch (RestClientException ex) { 
  // Handle exception 
} 

RestClient:

String request = restClient.get()  
  .uri( 
    "https://api.example.com/this-url-does-not-exist"
  )  
  .retrieve() 
  .onStatus(
    HttpStatusCode::is4xxClientError, 
    (request, response) -> {  
      throw new MyCustomRuntimeException(
        response.getStatusCode(), 
        response.getHeaders()
      )  
  }
) 
.body(String.class);

Как можно видеть из этих примеров, RestClient предлагает более лаконичный подход к отправке HTTP запросов по сравнению с RestTemplate. 

Ознакомиться с множеством других примеров использования можно в документации.

Заключение

Начиная со Spring Boot 3.2 и выше, RestClient становится современной заменой RestTemplate, предлагающей более интуитивно понятный и лаконичный способ взаимодействия с RESTful сервисами.Будучи надстройкой над WebClient, RestClient также удовлетворяет требованиям реактивности, при этом упрощая процесс отправки HTTP запросов.

Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм — Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.

Ждем всех,  присоединяйтесь!

© Habrahabr.ru