Что такое RestTemplate в Spring и как его использовать?

«Что такое RestTemplate в Spring и как его использовать?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

RestTemplate — это синхронный, блокирующий HTTP-клиент в Spring Framework для вызова RESTful веб-сервисов. Начиная с Spring 5, он находится в режиме поддержки, и для нового кода рекомендуется использовать реактивный WebClient.

Основные методы (по HTTP-глаголам):

  • getForObject(), getForEntity() — для GET-запросов.
  • postForObject(), postForEntity(), postForLocation() — для POST-запросов.
  • put() — для PUT-запросов.
  • delete() — для DELETE-запросов.
  • exchange() — универсальный метод для любых запросов с полным контролем над заголовками и телом.

Пример GET-запроса:

import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;

RestTemplate restTemplate = new RestTemplate();
String url = "https://api.example.com/users/{id}";

// Получение объекта (автоматическая десериализация JSON в POJO)
User user = restTemplate.getForObject(url, User.class, 1);

// Получение ResponseEntity с метаданными ответа (статус, заголовки)
ResponseEntity<User> response = restTemplate.getForEntity(url, User.class, 1);
if (response.getStatusCode().is2xxSuccessful()) {
    User userFromResponse = response.getBody();
}

Пример POST-запроса с телом и заголовками:

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer token123");

User newUser = new User("John Doe");
HttpEntity<User> request = new HttpEntity<>(newUser, headers);

User createdUser = restTemplate.postForObject("https://api.example.com/users", request, User.class);

Настройка: RestTemplate можно настроить через RestTemplateBuilder или создав бины для ClientHttpRequestFactory (например, HttpComponentsClientHttpRequestFactory для Apache HttpClient) и HttpMessageConverter (для обработки JSON, XML).

Недостатки (почему WebClient предпочтительнее):

  • Синхронный и блокирующий: Каждый вызов занимает поток на всё время запроса-ответа, что плохо масштабируется.
  • Ограниченная поддержка реактивных потоков.
  • Менее функциональный fluent API по сравнению с WebClient.