Ответ
WebClient — современный, реактивный HTTP-клиент. RestTemplate — устаревший, синхронный клиент (в Spring 5 помечен как @Deprecated).
Сравнительная таблица:
| Характеристика | RestTemplate | WebClient |
|---|---|---|
| Модель | Синхронная, блокирующая (Servlet API) | Асинхронная, неблокирующая (Reactive Streams) |
| Потоки | Занимает поток на время запроса | Использует малое количество потоков (Event Loop) |
| HTTP/2 | Ограниченная поддержка | Полная поддержка |
| Зависимости | spring-web |
spring-webflux |
| Стиль API | Императивный, на основе шаблона | Декларативный, fluent API |
Примеры кода:
RestTemplate (Синхронный):
RestTemplate rt = new RestTemplate();
String result = rt.getForObject("https://api.example.com/data", String.class); // Блокировка потока
System.out.println(result);
WebClient (Асинхронный):
// Неблокирующий вызов
WebClient.create()
.get()
.uri("https://api.example.com/data")
.retrieve()
.bodyToMono(String.class)
.subscribe(result -> System.out.println("Получено: " + result));
// Или блокирующее ожидание (если необходимо)
String result = WebClient.create()
.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class)
.block();
Рекомендация: Для новых проектов на Spring 5+ используйте WebClient. Он обеспечивает лучшую масштабируемость за счет неблокирующей модели и является частью реактивного стека Spring.
Ответ 18+ 🔞
Да ты посмотри, какая история-то разворачивается! Сидят два HTTP-клиента, как два брата, только один — старый, заслуженный дедок, а второй — молодой, реактивный выскочка. И дедку, RestTemplate, уже на пенсию собираются, помечают его @Deprecated, мол, отдохни, старина, мы тут по-новому будем.
Ну и что у нас по факту?
| Что сравниваем | RestTemplate (Дедок) | WebClient (Молодой и дерзкий) |
|---|---|---|
| Как работает | Синхронно, по-старинке. Запрос сделал — сиди, жди ответа, поток занят. | Асинхронно, неблокирующе. Сделал запрос и пошёл дальше дела вершить, а ответ тебе прилетит, когда будет готов. |
| Потоки | Жрёт их, как не в себя. Каждый запрос — отдельный поток в ожидании. | Экономный, как шотландец. Мало потоков использует, работает на event loop'ах. |
| HTTP/2 | Поддержка есть, но так, сбоку бантик, не полноценная. | Поддерживает на ура, со всеми плюшками. |
| Что нужно в проект | Достаточно spring-web, старый добрый модуль. |
Требует spring-webflux, реактивщину подтянуть. |
| Стиль API | Императивный, шаблонный. Классика, но скучновато. | Декларативный, fluent API. Прям как стихи писать: точка, точка, запятая — и готово. |
И вот смотри, как они кодят:
RestTemplate (Дедок, который всё заблокирует):
RestTemplate rt = new RestTemplate();
String result = rt.getForObject("https://api.example.com/data", String.class); // Сиди и жди, пока мир повернётся
System.out.println(result);
WebClient (Юный реактивный гений):
// Сделал и забыл, живёшь дальше
WebClient.create()
.get()
.uri("https://api.example.com/data")
.retrieve()
.bodyToMono(String.class)
.subscribe(result -> System.out.println("Получено, ёпта: " + result));
// Или, если уж совсем припёрло и нужно синхронно (но это неспортивно!)
String result = WebClient.create()
.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class)
.block(); // Ну вот, испортил всю малину, превратил в дедка!
Итог, блядь: Если пишешь новый проект на Spring 5 и выше — даже не думай, бери WebClient. Это как пересаживаться с запряжённой лошади на электровелосипед. Масштабируемость — овердохуичная, ресурсы экономит, да и будущее уже за реактивной моделью. А дедка RestTemplate пусть в легаси-проектах доживает свой век, в рот меня чих-пых.