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().