Класс HttpClient
- Все реализуемые интерфейсы:
AutoCloseable
public abstract class HttpClient extends Object implements AutoCloseable
HttpClient можно использовать для отправки запросов и получения ответов на них.
HttpClient создаётся с помощью builder. Метод newBuilder возвращает построитель, создающий экземпляры реализации HttpClient по умолчанию. Построитель можно использовать для настройки состояния клиента, например: предпочтительной версии протокола (HTTP/1.1 или HTTP/2), необходимости следовать перенаправлениям, прокси-сервера, средства аутентификации и т. д. После создания HttpClient становится неизменяемым и может использоваться для отправки нескольких запросов.
HttpClient предоставляет сведения о конфигурации и совместно использует ресурсы для всех отправляемых через него запросов. Экземпляр HttpClient обычно управляет собственными пулами соединений, которые он может повторно использовать при необходимости. Пулы соединений, как правило, не используются совместно экземплярами HttpClient. Создание нового клиента для каждой операции возможно, но обычно не позволяет повторно использовать такие соединения.
Для каждого отправляемого HttpRequest необходимо указать BodyHandler. BodyHandler определяет способ обработки тела ответа, если оно есть. После получения HttpResponse становятся доступны заголовки, код ответа и, как правило, тело. Чтение байтов тела ответа зависит от типа, T, тела ответа.
Запросы можно отправлять синхронно или асинхронно:
-
send(HttpRequest, BodyHandler)блокирует выполнение до отправки запроса и получения ответа. -
sendAsync(HttpRequest, BodyHandler)отправляет запрос и получает ответ асинхронно. МетодsendAsyncнемедленно возвращаетCompletableFuture<HttpResponse>.CompletableFutureзавершается, когда ответ становится доступен. ВозвращённыйCompletableFutureможно комбинировать различными способами, чтобы объявлять зависимости между несколькими асинхронными задачами.
Пример синхронного вызова
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body()); Пример асинхронного вызова
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://foo.com/"))
.timeout(Duration.ofMinutes(2))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofFile(Paths.get("file.json")))
.build();
client.sendAsync(request, BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println); - Примечание к API:
- Ресурсы, выделенные
HttpClient, могут быть освобождены раньше при закрытии клиента. - Примечание по реализации:
-
Классы
HttpResponse.BodyHandlersиHttpResponse.BodySubscribersпредоставляют некоторые реализацииBodyHandlerиBodySubscriberдля потоковой передачи или публикации, позволяющие передавать данные тела потоком обратно вызывающему коду. Чтобы освободить ресурсы, связанные с этими потоками, и считать HTTP-запрос завершённым, вызывающий код должен в конечном итоге получить потоковое тело ответа и закрыть, отменить или полностью прочитать возвращённые потоки. Аналогичным образом, пользовательская реализацияHttpResponse.BodySubscriberдолжна либо запросить все данные до получения сигналаonCompleteилиonError, либо в конечном итоге отменить свою подписку.Встроенная реализация
HttpClientиз JDK переопределяет методыclose(),shutdown(),shutdownNow(),awaitTermination(Duration)иisTerminated(), предоставляя их максимально возможную реализацию. Если не закрыть, не отменить или не прочитатьstreaming or publishing bodiesполностью, доставка данных может прекратиться, хотя запрос останется открытым, что может задержать штатное завершение работы. При вызове методаshutdownNow()будет предпринята попытка отменить все такие незавершённые запросы, но это может привести к внезапному прекращению любой выполняющейся операции.Если встроенная реализация
HttpClientиз JDK не закрыта явно, она освобождает свои ресурсы, когда экземплярHttpClientперестаёт быть сильно достижимым и все запущенные на нём операции в конечном итоге завершаются. Для этого сборщик мусора должен обнаружить, что экземпляр больше недостижим, а все запросы, запущенные клиентом, должны в конечном итоге завершиться. Если не закрыть должным образом потоковые тела или тела публикации, связанные запросы могут не завершиться, что помешает сборщику мусора освободить ресурсы, выделенные соответствующим клиентом. - Начиная с версии:
- 11
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static interface |
HttpClient.Builder |
Построитель HTTP-клиентов. |
static enum |
HttpClient.Redirect |
Определяет политику автоматического перенаправления. |
static enum |
HttpClient.Version |
Версия протокола HTTP. |
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Создаёт HttpClient. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Optional |
authenticator() |
Возвращает Optional, содержащий Authenticator, заданное для этого клиента. |
boolean |
awaitTermination |
Блокирует выполнение до завершения всех операций после запроса на завершение работы, истечения duration или прерывания текущего потока — в зависимости от того, что произойдёт раньше. |
void |
close() |
Инициирует штатное завершение работы: запросы, ранее отправленные с помощью send или sendAsync, выполняются до завершения, но новые запросы приниматься не будут. |
abstract Optional |
connectTimeout() |
Возвращает Optional, содержащий длительность тайм-аута подключения для этого клиента. |
abstract Optional |
cookieHandler() |
Возвращает Optional, содержащий CookieHandler этого клиента. |
abstract Optional |
executor() |
Возвращает Optional, содержащий Executor этого клиента. |
abstract HttpClient.Redirect |
followRedirects() |
Возвращает политику следования перенаправлениям для этого клиента. |
boolean |
isTerminated() |
Возвращает true, если после завершения работы все операции выполнены. |
static HttpClient.Builder |
newBuilder() |
Создаёт новый построитель HttpClient. |
static HttpClient |
newHttpClient() |
Возвращает новый HttpClient с настройками по умолчанию. |
WebSocket.Builder |
newWebSocketBuilder() |
Создаёт новый построитель WebSocket (необязательная операция). |
abstract Optional |
proxy() |
Возвращает Optional, содержащий ProxySelector, заданный для этого клиента. |
abstract <T> HttpResponse |
send |
Отправляет указанный запрос с помощью этого клиента, при необходимости блокируя выполнение до получения ответа. |
abstract <T> CompletableFuture |
sendAsync |
Асинхронно отправляет указанный запрос с помощью этого клиента, используя заданный обработчик тела ответа. |
abstract <T> CompletableFuture |
sendAsync |
Асинхронно отправляет указанный запрос с помощью этого клиента, используя заданные обработчик тела ответа и обработчик обещаний push. |
void |
shutdown() |
Инициирует штатное завершение работы: запросы, ранее отправленные с помощью send или sendAsync, выполняются до завершения, но новые запросы приниматься не будут. |
void |
shutdownNow() |
Этот метод пытается инициировать немедленное завершение работы. |
abstract SSLContext |
sslContext() |
Возвращает SSLContext этого клиента. |
abstract SSLParameters |
sslParameters() |
Возвращает копию SSLParameters этого клиента. |
abstract HttpClient.Version |
version() |
Возвращает предпочтительную версию протокола HTTP для этого клиента. |
Подробное описание конструкторов
HttpClient
protected HttpClient()
Подробное описание методов
newHttpClient
public static HttpClient newHttpClient()
HttpClient с настройками по умолчанию. Эквивалентно newBuilder().build().
Настройки по умолчанию включают: метод запроса "GET", предпочтение HTTP/2, политику перенаправления NEVER, селектор прокси по умолчанию и контекст SSL по умолчанию.
- Примечание по реализации:
- Системные значения по умолчанию извлекаются во время создания экземпляра
HttpClient. Изменение системных значений после создания экземпляраHttpClient, например вызовомProxySelector.setDefault(ProxySelector)илиSSLContext.setDefault(SSLContext), не влияет на уже созданные экземпляры. - Возвращает:
- новый HttpClient
- Выбрасывает:
-
UncheckedIOException— если не удается выделить необходимые базовые ресурсы ввода-вывода для создания нового HttpClient.
newBuilder
public static HttpClient.Builder newBuilder()
HttpClient. Конструкторы, возвращаемые этим методом, создают экземпляры реализации HttpClient по умолчанию.
- Возвращает:
HttpClient.Builder
cookieHandler
public abstract Optional<CookieHandler> cookieHandler()
Optional, содержащий CookieHandler этого клиента. Если в конструкторе этого клиента не был задан CookieHandler, то Optional пуст.- Возвращает:
Optional, содержащийCookieHandlerэтого клиента
connectTimeout
public abstract Optional<Duration> connectTimeout()
Optional, содержащий длительность тайм-аута подключения для этого клиента. Если длительность тайм-аута подключения не была задана в конструкторе клиента, то Optional пуст.- Возвращает:
Optional, содержащий длительность тайм-аута подключения этого клиента
followRedirects
public abstract HttpClient.Redirect followRedirects()
NEVER.- Возвращает:
- настройку перенаправлений этого клиента
proxy
public abstract Optional<ProxySelector> proxy()
Optional, содержащий ProxySelector, предоставленный этому клиенту. Если в конструкторе этого клиента не был задан селектор прокси, то Optional пуст. Несмотря на то что этот метод может возвращать пустой optional, у
HttpClient все еще может быть непредоставляемый селектор прокси по умолчанию, используемый для отправки HTTP-запросов.
- Возвращает:
Optional, содержащий селектор прокси, предоставленный этому клиенту.
sslContext
public abstract SSLContext sslContext()
SSLContext этого клиента. Если в конструкторе этого клиента не был задан SSLContext, возвращается контекст по умолчанию.
- Возвращает:
- SSLContext этого клиента
sslParameters
public abstract SSLParameters sslParameters()
SSLParameters этого клиента. Если в конструкторе клиента не были заданы SSLParameters, возвращается набор параметров по умолчанию, определяемый реализацией и используемый клиентом.
- Возвращает:
SSLParametersэтого клиента
authenticator
public abstract Optional<Authenticator> authenticator()
Optional, содержащий Authenticator, заданный для этого клиента. Если в конструкторе клиента не был задан Authenticator, то Optional пуст.- Возвращает:
Optional, содержащийAuthenticatorэтого клиента
version
public abstract HttpClient.Version version()
HttpClient.Version.HTTP_2
- Примечание по реализации:
- На выбор версии протокола также могут влиять ограничения. Например, если через прокси запрошен HTTP/2, а реализация не поддерживает этот режим, может использоваться HTTP/1.1
- Возвращает:
- запрошенную версию протокола HTTP
executor
public abstract Optional<Executor> executor()
Optional, содержащий Executor этого клиента. Если в конструкторе клиента не был задан Executor, то Optional пуст. Несмотря на то что этот метод может возвращать пустой optional, у
HttpClient все еще может быть непредоставляемый исполнитель по умолчанию, используемый для выполнения асинхронных и зависимых задач.
- Возвращает:
Optional, содержащийExecutorэтого клиента
send
public abstract <T> HttpResponse<T> send(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler) throws IOException, InterruptedException
HttpResponse<T> содержит статус ответа, заголовки и тело (обработанное указанным обработчиком тела ответа). Если операция прерывается, реализация HttpClient по умолчанию пытается отменить обмен HTTP и выбрасывает InterruptedException. Не гарантируется, когда именно запрос на отмену будет принят к исполнению. В частности, запрос все еще может быть отправлен серверу, поскольку его обработка могла уже асинхронно начаться в другом потоке, а освобождение базовых ресурсов может выполняться только асинхронно.
- В случае HTTP/1.1 попытка отмены может привести к резкому закрытию базового соединения.
- В случае HTTP/2 попытка отмены может привести к сбросу потока или, в некоторых обстоятельствах, также к резкому закрытию соединения, например если поток в данный момент пытается выполнить запись в базовый сокет.
- Параметры типа:
T— тип тела ответа- Параметры:
-
request— запрос -
responseBodyHandler— обработчик тела ответа - Возвращает:
- ответ
- Выбрасывает:
-
IOException— если при отправке или получении произошла ошибка ввода-вывода либо клиент был остановлен -
InterruptedException— если операция была прервана -
IllegalArgumentException— если аргументrequestне является запросом, который можно было корректно создать в соответствии с требованиямиHttpRequest.Builder.
sendAsync
public abstract <T> CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
Эквивалентно: sendAsync(request, responseBodyHandler, null).
- Параметры типа:
T— тип тела ответа- Параметры:
-
request— запрос -
responseBodyHandler— обработчик тела ответа - Возвращает:
CompletableFuture<HttpResponse<T>>- Выбрасывает:
-
IllegalArgumentException— если аргументrequestне является запросом, который можно было корректно создать в соответствии с требованиямиHttpRequest.Builder.
sendAsync
public abstract <T> CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler, HttpResponse.PushPromiseHandler<T> pushPromiseHandler)
Если возвращенный CompletableFuture завершается успешно, он завершается с объектом HttpResponse<T>, содержащим статус ответа, заголовки и тело (обработанное указанным обработчиком тела ответа).
Полученные push-обещания, если таковые имеются, обрабатываются указанным pushPromiseHandler. null со значением pushPromiseHandler отклоняет все push-обещания.
Возвращенный CompletableFuture завершается с исключением в следующих случаях:
-
IOException— если при отправке или получении произошла ошибка ввода-вывода либо клиент был остановлен.
Реализация HttpClient по умолчанию возвращает объекты CompletableFuture, которые можно отменить. Объекты CompletableFuture, созданные на основе отменяемых future, сами также можно отменить. Вызов cancel(true) для отменяемого future, которое еще не завершено, пытается отменить обмен HTTP, чтобы как можно скорее освободить базовые ресурсы. Не гарантируется, когда именно запрос на отмену будет принят к исполнению. В частности, запрос все еще может быть отправлен серверу, поскольку его обработка могла уже асинхронно начаться в другом потоке, а освобождение базовых ресурсов может выполняться только асинхронно.
- В случае HTTP/1.1 попытка отмены может привести к резкому закрытию базового соединения.
- В случае HTTP/2 попытка отмены может привести к сбросу потока.
- Параметры типа:
T— тип тела ответа- Параметры:
-
request— запрос -
responseBodyHandler— обработчик тела ответа -
pushPromiseHandler— обработчик push-обещаний; может иметь значение null - Возвращает:
CompletableFuture<HttpResponse<T>>- Выбрасывает:
-
IllegalArgumentException— если аргументrequestне является запросом, который можно было корректно создать в соответствии с требованиямиHttpRequest.Builder.
newWebSocketBuilder
public WebSocket.Builder newWebSocketBuilder()
WebSocket (необязательная операция). Пример
HttpClient client = HttpClient.newHttpClient();
CompletableFuture<WebSocket> ws = client.newWebSocketBuilder()
.buildAsync(URI.create("ws://websocket.example.com"), listener); Более точного управления начальным рукопожатием WebSocket можно добиться, используя пользовательский HttpClient.
Пример
InetSocketAddress addr = new InetSocketAddress("proxy.example.com", 80);
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(addr))
.build();
CompletableFuture<WebSocket> ws = client.newWebSocketBuilder()
.buildAsync(URI.create("ws://websocket.example.com"), listener); - Требования к реализации:
- Реализация этого метода по умолчанию выбрасывает
UnsupportedOperationException. Клиенты, полученные с помощьюnewHttpClient()илиnewBuilder(), возвращают конструкторWebSocket. - Примечание по реализации:
- И конструктор, и созданные с его помощью
WebSocketработают неблокирующим образом. Это означает, что их методы не блокируются до возвращенияCompletableFuture. Асинхронные задачи выполняются в исполнителе этогоHttpClient.После завершения
CompletionStage, возвращенного изListener.onClose,WebSocketотправляет сообщение Close с тем же кодом, что и у полученного сообщения, и пустой причиной. - Возвращает:
WebSocket.Builder- Выбрасывает:
-
UnsupportedOperationException— если этотHttpClientне поддерживает WebSocket
shutdown
public void shutdown()
send или sendAsync, выполняются до завершения, но новые запросы не принимаются. Выполнение запроса до завершения может включать выполнение нескольких фоновых операций, в том числе ожидание доставки ответов; все они должны завершиться, прежде чем запрос будет считаться выполненным. Если клиент уже завершает работу, вызов не оказывает дополнительного эффекта. Этот метод не ожидает завершения выполнения ранее отправленных запросов. Для этого используйте awaitTermination или close.
- Требования к реализации:
- Реализация этого метода по умолчанию ничего не делает. Подклассам следует переопределить этот метод, чтобы реализовать соответствующее поведение.
- С версии:
- 21
- См. также:
awaitTermination
public boolean awaitTermination(Duration duration) throws InterruptedException
duration или прерывания текущего потока с помощью interrupt — в зависимости от того, что произойдет первым. Операциями считаются любые задачи, необходимые для полного выполнения запроса, ранее отправленного с помощью send или sendAsync. Этот метод не ожидает завершения, если длительность ожидания меньше или равна нулю. В этом случае метод просто проверяет, завершился ли поток.
- Требования к реализации:
- Реализация этого метода по умолчанию проверяет аргументы на null, но в остальном ничего не делает и возвращает true. Подклассам следует переопределить этот метод, чтобы реализовать надлежащее поведение.
- Параметры:
-
duration— максимальное время ожидания - Возвращает:
-
true, если работа этого клиента завершилась, иfalse, если время ожидания истекло до завершения - Выбрасывает:
-
InterruptedException— если во время ожидания произошло прерывание - С версии:
- 21
- См. также:
isTerminated
public boolean isTerminated()
true, если после завершения работы выполнены все операции. Операциями считаются любые задачи, необходимые для полного выполнения запроса, ранее отправленного с помощью send или sendAsync. Обратите внимание, что isTerminated никогда не имеет значения true, если предварительно не был вызван либо shutdown, либо shutdownNow.
- Требования к реализации:
- Реализация этого метода по умолчанию ничего не делает и возвращает false. Подклассам следует переопределить этот метод, чтобы реализовать надлежащее поведение.
- Возвращает:
-
true, если после завершения работы все задачи выполнены - С версии:
- 21
- См. также:
shutdownNow
public void shutdownNow()
send или sendAsync. Поведение активно выполняющихся операций при прерывании не определено. В частности, не гарантируется, что прерванные операции завершатся или что ожидающий их код когда-либо получит уведомление.- Требования к реализации:
- Реализация этого метода по умолчанию просто вызывает
shutdown(). Подклассам следует переопределить этот метод, чтобы реализовать соответствующее поведение. - С версии:
- 21
- См. также:
close
public void close()
send или sendAsync, выполняются до завершения, но новые запросы не принимаются. Выполнение запроса до завершения может включать несколько фоновых операций, в том числе ожидание доставки ответов. Этот метод ожидает завершения выполнения всех операций и остановки клиента. Если во время ожидания происходит прерывание, этот метод может попытаться остановить все операции, вызвав shutdownNow(). Затем он продолжает ожидание до завершения всех активно выполняющихся операций. Перед возвратом из метода статус прерывания будет восстановлен.
Если работа клиента уже завершилась, вызов этого метода не оказывает эффекта.
- Определен в:
-
closeв интерфейсеAutoCloseable - Требования к реализации:
- Реализация по умолчанию вызывает
shutdown()и ожидает завершения задач с помощьюawaitTermination. - С версии:
- 21
- См. также:
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.net.http/java/net/http/HttpClient.html