Класс HttpClient
- Все реализуемые интерфейсы:
AutoCloseable
public abstract class HttpClient extends Object implements AutoCloseable
HttpClient можно использовать для отправки запросов и получения соответствующих ответов.
HttpClient создаётся с помощью builder. Метод newBuilder возвращает построитель, создающий экземпляры реализации HttpClient по умолчанию. Построитель можно использовать для настройки состояния клиента, например: предпочтительной версии протокола (HTTP/1.1, HTTP/2 или HTTP/3), необходимости следовать перенаправлениям, прокси-сервера, средства аутентификации и т. д. После создания 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();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://foo.com/"))
.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должна либо запрашивать request все данные до получения сигналаonCompleteилиonError, либо в конечном итоге отменить подписку.Встроенная реализация JDK
HttpClientпереопределяет методыclose(),shutdown(),shutdownNow(),awaitTermination(Duration)иisTerminated(), обеспечивая их наилучшую возможную реализацию. Если не закрыть, не отменить или не прочитатьstreaming or publishing bodiesдо конца, доставка данных может остановиться, а запрос останется открытым, что может задержать штатное завершение работы. При вызове методаshutdownNow()будет предпринята попытка отменить все такие незавершённые запросы, но это может привести к резкому завершению любой выполняющейся операции.Если встроенная реализация JDK
HttpClientне закрыта явно, она освобождает свои ресурсы, когда экземплярHttpClientперестаёт быть сильно достижимым и все операции, начатые на этом экземпляре, в конечном итоге завершаются. Это зависит как от того, заметит ли сборщик мусора, что экземпляр больше недостижим, так и от того, завершатся ли в конечном итоге все запросы, начатые клиентом. Если не закрыть должным образом потоковые тела или тела публикации, связанные запросы могут не завершиться, а сборщик мусора не сможет освободить ресурсы, выделенные соответствующим клиентом.Реализация
HttpClientпо умолчанию поддерживает HTTP/1.1, HTTP/2 и HTTP/3. Фактически используемая при отправке запроса версия протокола может зависеть от нескольких факторов. В случае HTTP/2 это может зависеть от успешного первоначального обновления (при использовании обычного соединения) или от успешного согласования HTTP/2 во время рукопожатия протокола TLS (Transport Layer Security).Если для незашифрованного соединения выбрана версия HTTP/2 и соединение HTTP/2 с исходным сервером ещё не установлено, клиент создаст новое соединение и попытается выполнить обновление с HTTP/1.1 до HTTP/2. Если обновление будет успешным, для ответа на этот запрос будет использоваться HTTP/2. Если обновление не удастся, ответ будет обработан с использованием HTTP/1.1.
На выбор версии протокола могут влиять и другие ограничения. Например, если HTTP/2 запрашивается через прокси-сервер и реализация не поддерживает такой режим, может использоваться HTTP/1.1.
По умолчанию протокол HTTP/3 не выбирается, но его можно включить, задав предпочтительную версию HttpClient или предпочтительную версию HttpRequest равной HTTP/3. Как и в случае HTTP/2, фактически используемая версия протокола при включённом HTTP/3 может зависеть от нескольких факторов. Подсказки конфигурации можно указать, чтобы помочь реализации
HttpClientопределить способ установления и выполнения обмена данными HTTP при включённом протоколе HTTP/3. Если подсказки конфигурации не указаны,HttpClientвыберет одну из них, как описано в документации API параметраH3_DISCOVERY.
Обратите внимание: запрос, схема URI которого не является"https", никогда не будет отправлен по HTTP/3. В этой реализации HTTP/3 не используется, если выбран прокси-сервер.Если конкретный экземпляр
HttpClientне поддерживает отправку запросов через HTTP/3, может быть выброшено исключениеUnsupportedProtocolVersionException: либо при создании клиента с предпочтительной версией HTTP/3, либо при попытке отправить запрос с включённым HTTP/3, если был указан параметрHTTP_3_URI_ONLY. Обычно это может произойти, если настроенные для экземпляра клиентаSSLContextилиSSLParametersнельзя использовать с HTTP/3. - Начиная с:
- 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 |
Асинхронно отправляет указанный запрос с помощью этого клиента, используя заданные обработчик тела ответа и обработчик обещаний на отправку. |
void |
shutdown() |
Инициирует штатное завершение работы: запросы, ранее переданные с помощью send или sendAsync, будут выполнены до конца, но новые запросы приниматься не будут. |
void |
shutdownNow() |
Этот метод пытается инициировать немедленное завершение работы. |
abstract SSLContext |
sslContext() |
Возвращает SSLContext этого клиента. |
abstract SSLParameters |
sslParameters() |
Возвращает копию SSLParameters этого клиента. |
abstract HttpClient.Version |
version() |
Возвращает предпочтительную версию протокола HTTP для этого клиента. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли другой объект этому объекту. |
protected void |
finalize() |
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии. Финализация объявлена устаревшей и может быть удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода для этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Подробное описание конструкторов
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 может быть не предоставляемый через API селектор прокси по умолчанию, используемый для отправки 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
- Примечание по реализации:
- На версию протокола, которую
HttpClientв конечном итоге выбирает для запроса, влияют различные факторы, указанные в разделе Выбор версии протокола. - Возвращает:
- запрошенную версию протокола HTTP
executor
public abstract Optional<Executor> executor()
Optional, содержащий Executor этого клиента. Если в конструкторе клиента не был задан Executor, то Optional пуст. Хотя этот метод может вернуть пустой объект Optional, у
HttpClient может быть не предоставляемый через API исполнитель по умолчанию, используемый для выполнения асинхронных и зависимых задач.
- Возвращает:
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. Значение pushPromiseHandler, равное null, отклоняет все обещания push.
Возвращенный объект CompletableFuture завершается с исключением в следующих случаях:
-
IOException— если при отправке или получении произошла ошибка ввода-вывода либо клиент был закрыт.
Реализация HttpClient по умолчанию возвращает объекты CompletableFuture, которые можно отменить. Объекты CompletableFuture, полученные на основе отменяемых будущих результатов, также можно отменить. Вызов cancel(true) для незавершенного отменяемого будущего результата пытается отменить обмен 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 или прерывания текущего потока — в зависимости от того, что произойдет раньше. Операциями считаются любые задачи, необходимые для полного выполнения ранее отправленного с помощью 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.