Gymterview
junior

Что такое HttpClient API в Java 11?

HttpClient — стандартный HTTP-клиент в JDK, поддерживающий HTTP/1.1 и HTTP/2, синхронные и асинхронные запросы. Заменяет устаревший HttpURLConnection.

Аналогия из жизни: если старый HttpURLConnection — это отправка письма почтой (долго настраивать, неудобно), то HttpClient — мессенджер: отправил запрос, получил ответ, можно отправить несколько одновременно.

Пример: создание клиента и запросы
// Создание клиента (рекомендуется переиспользовать)
HttpClient client = HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_2)
    .connectTimeout(Duration.ofSeconds(10))
    .followRedirects(HttpClient.Redirect.NORMAL)
    .build();

// GET-запрос (синхронный)
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users/1"))
    .header("Accept", "application/json")
    .GET()
    .build();

HttpResponse<String> response = client.send(request,
    HttpResponse.BodyHandlers.ofString());

System.out.println(response.statusCode());  // 200
System.out.println(response.body());        // JSON

// POST-запрос
HttpRequest postRequest = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users"))
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(
        """
        {"name": "John", "email": "john@example.com"}
        """))
    .build();

// Асинхронный запрос (возвращает CompletableFuture)
CompletableFuture<HttpResponse<String>> future =
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString());

future.thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

Чтение ответа в разные типы

Пример
// В строку
HttpResponse<String> str = client.send(req, BodyHandlers.ofString());
// В файл
HttpResponse<Path> file = client.send(req, BodyHandlers.ofFile(Path.of("out.json")));
// В InputStream
HttpResponse<InputStream> stream = client.send(req, BodyHandlers.ofInputStream());
// Отбросить тело
HttpResponse<Void> discarded = client.send(req, BodyHandlers.discarding());

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

  • Создание нового HttpClient на каждый запрос — дорого; переиспользуйте экземпляр
  • Не обрабатывать HTTP-статусы — send() не бросает исключение для 4xx/5xx; проверяйте statusCode()
  • Блокирующий join() на sendAsync() — теряется смысл асинхронности; используйте thenApply/thenAccept

Как используется в 2026

  • В Spring-приложениях вместо HttpClient чаще используют RestClient (Spring 6.1+) или WebClient
  • HttpClient из JDK полезен для standalone-приложений и библиотек без Spring-зависимостей
  • В микросервисах HTTP-клиент обычно оборачивается в абстракцию с retry, timeout, circuit breaker

На собеседовании: важно упомянуть потокобезопасность HttpClient (один экземпляр на приложение), нативную поддержку HTTP/2 и то, что send() не бросает исключение для 4xx/5xx — нужна ручная проверка statusCode().