Gymterview
middle

Какие HTTP-клиенты используются в Spring в 2026 году?

RestClient — рекомендованный HTTP-клиент для синхронных Spring-приложений, пришедший на замену RestTemplate. Он сочетает fluent API и синхронную модель выполнения.

Эволюция HTTP-клиентов

Клиент Версия Тип Статус в 2026
RestTemplate Spring 3.0 (2009) Синхронный, шаблонный Maintenance
WebClient Spring 5.0 (2017) Реактивный / блокирующий Для реактивных приложений
RestClient Spring 6.1 (2023) Синхронный, fluent API Рекомендован
HTTP Interface Spring 6.0 (2022) Декларативный (как Feign) Набирает популярность

RestClient — конфигурация и использование

Пример RestClient
@Configuration
public class HttpClientConfig {

    @Bean
    public RestClient paymentRestClient(RestClient.Builder builder) {
        return builder
            .baseUrl("https://payment-service.internal")
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .requestInterceptor((request, body, execution) -> {
                request.getHeaders().set("X-Trace-Id", MDC.get("traceId"));
                return execution.execute(request, body);
            })
            .defaultStatusHandler(
                HttpStatusCode::is5xxServerError,
                (request, response) -> {
                    throw new PaymentServiceUnavailableException(
                        "Payment service returned " + response.getStatusCode());
                })
            .build();
    }
}

@Component
public class PaymentGatewayAdapter implements PaymentGateway {

    private final RestClient restClient;

    public PaymentResult charge(UUID orderId, Money amount) {
        return restClient.post()
            .uri("/api/v1/charges")
            .body(new ChargeRequest(orderId, amount.value(), amount.currency()))
            .retrieve()
            .body(PaymentResult.class);
    }
}

Декларативный HTTP Interface

HTTP Interface работает аналогично Feign, но на базе RestClient:

Пример
public interface PaymentServiceClient {

    @PostExchange("/api/v1/charges")
    PaymentResult charge(@RequestBody ChargeRequest request);

    @GetExchange("/api/v1/charges/{id}/status")
    PaymentStatus getStatus(@PathVariable UUID id);
}

Частые ошибки

  • Использование RestTemplate в новых проектах — он в режиме maintenance
  • Отсутствие обработки ошибок и таймаутов в HTTP-клиенте
  • Отсутствие передачи trace ID между сервисами

На собеседовании: ключевой вопрос: “Чем RestClient отличается от WebClient?” RestClient — синхронный fluent API, WebClient — реактивный. С Virtual Threads RestClient даёт ту же масштабируемость, что и WebClient, но с простым синхронным кодом. Упоминание HTTP Interface как декларативной альтернативы Feign покажет, что вы следите за экосистемой.