Ответ
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.