Класс 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, либо в конечном итоге отменить подписку.Встроенная в JDK реализация
HttpClientпереопределяетclose(),shutdown(),shutdownNow(),awaitTermination(Duration)иisTerminated(), чтобы обеспечить реализацию с наилучшими усилиями. Отсутствие закрытия, отмены или чтенияstreaming or publishing bodiesдо исчерпания может остановить передачу данных, оставив запрос открытым, и затормозить упорядоченное завершение. МетодshutdownNow(), если он вызван, попытается отменить любые такие незавершенные запросы, но может привести к внезапному прерыванию любой текущей операции.Если не явным образом закрыт, встроенная в JDK реализация
HttpClientосвобождает свои ресурсы, когда экземплярHttpClientбольше не доступен по сильной ссылке, и все операции, начатые на этом экземпляре, в конечном итоге завершились. Это зависит как от сборщика мусора, который замечает, что экземпляр больше недоступен, так и от того, что все запросы, начатые на клиенте, в конечном итоге завершились. Отсутствие правильного закрытия потоковых или публикуемых тел может помешать связанным запросам завершиться и помешать сборщику мусора освободить ресурсы, выделенные связанным клиентом. - С:
- 11
Краткое описание вложенных классов
| Modifier and Type | Class | Description |
|---|---|---|
static interface |
HttpClient.Builder |
Построитель HTTP-клиентов. |
static enum |
HttpClient.Redirect |
Определяет политику автоматического перенаправления. |
static enum |
HttpClient.Version |
Версия протокола HTTP. |
Краткое описание конструкторов
| Modifier | Constructor | Description |
|---|---|---|
protected |
Создаёт HttpClient. |
Краткое описание методов
| Modifier and Type | Method | Description |
|---|---|---|
abstract Optional |
authenticator() |
Возвращает Optional, содержащий Authenticator, установленный для этого клиента. |
boolean |
awaitTermination |
Ожидает завершения всех операций после запроса остановки, истечения duration или прерывания текущего потока, что произойдёт первым. |
void |
close() |
Запускает упорядоченную остановку, в которой запросы, ранее переданные в send или sendAsync, выполняются до завершения, но новые запросы не принимаются. |
abstract Optional |
connectTimeout() |
Возвращает Optional, содержащий время ожидания подключения для этого клиента. |
abstract Optional |
cookieHandler() |
Возвращает Optional, содержащий обработчик файлов cookie (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 для этого клиента. |
Подробное описание конструкторов
HttpClient
protected HttpClient()
Подробное описание методов
newHttpClient
public static HttpClient newHttpClient()
Эквивалентно newBuilder().build().
Настройки по умолчанию включают: метод запроса "GET", предпочтение HTTP/2, политику перенаправления НЕСКОЛЬКО, по умолчанию селектор прокси и по умолчанию контекст 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, содержащий обработчик файлов cookie этого клиента. Если обработчик файлов cookie не был задан в создателе этого клиента, то Optional пуст.- Возвращает:
Optional, содержащий обработчик файлов cookie этого клиента
connectTimeout
public abstract Optional<Duration> connectTimeout()
Optional, содержащий время ожидания подключения для этого клиента. Если время ожидания подключения не было установлено в создателе клиента, то Optional пуст.- Возвращает:
Optional, содержащий время ожидания подключения этого клиента
followRedirects
public abstract HttpClient.Redirect followRedirects()
NEVER.- Возвращает:
- настройки перенаправления этого клиента
proxy
public abstract Optional<ProxySelector> proxy()
Optional, содержащий селектор прокси, предоставленный для этого клиента. Если селектор прокси не был задан в создателе этого клиента, то Optional пуст. Даже если этот метод может вернуть пустой необязательный параметр, у
HttpClient может быть незаявленный селектор прокси по умолчанию, который используется для отправки HTTP-запросов.
- Возвращает:
Optional, содержащий селектор прокси, предоставленный для этого клиента.
sslContext
public abstract SSLContext sslContext()
Если контекст SSL не был задан в создателе этого клиента, то возвращается по умолчанию.
- Возвращает:
- контекст SSL этого клиента
sslParameters
public abstract SSLParameters sslParameters()
Если параметры SSL не были заданы в создателе клиента, то возвращается набор параметров по умолчанию, используемых клиентом.
- Возвращает:
- параметры SSL этого клиента
authenticator
public abstract Optional<Authenticator> authenticator()
Optional, содержащий аутентификатор, установленный для этого клиента. Если аутентификатор не был задан в создателе клиента, то Optional пуст.- Возвращает:
Optional, содержащий аутентификатор этого клиента
version
public abstract HttpClient.Version version()
HttpClient.Version.HTTP_2
- Замечание по реализации:
- Ограничения также могут влиять на выбор версии протокола. Например, если HTTP/2 запрашивается через прокси, и если реализация не поддерживает этот режим, то может использоваться HTTP/1.1
- Возвращает:
- запрошенная версия протокола HTTP
executor
public abstract Optional<Executor> executor()
Optional, содержащий потоковую пул этого клиента. Если потоковая пул не была задана в создателе клиента, то Optional пуст. Даже если этот метод может вернуть пустой необязательный параметр, у
HttpClient может быть незаявленный потоковая пул по умолчанию, который используется для выполнения асинхронных и зависимых задач.
- Возвращает:
Optional, содержащий потоковую пул этого клиента
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)
Возвращаемое выполнимое будущее, при успешном завершении, завершается с HttpResponse<T>, содержащим статус ответа, заголовки и тело (обработанные заданным обработчиком тела ответа).
Полученные, при необходимости, обещания обрабатываются заданным pushPromiseHandler. null значение pushPromiseHandler отклоняет любые обещания.
Возвращаемое выполнимое будущее завершается ошибкой с:
-
IOException- если при отправке или приёме произошла ошибка ввода-вывода, или клиент был закрыт.
Реализация по умолчанию HttpClient возвращает CompletableFuture объекты, которые являются отменяемыми. CompletableFuture объекты, полученные от отменяемых будущих, сами являются отменяемыми. Вызов cancel(true) для отменяемого будущего, которое ещё не завершилось, пытается отменить HTTP обмен в попытке освободить базовые ресурсы как можно быстрее. Не гарантируется, когда запрос на отмену может быть учтён. В частности, запрос всё ещё может быть отправлен серверу, так как его обработка может уже начаться асинхронно в другом потоке, а базовые ресурсы могут быть освобождены асинхронно.
- С HTTP/1.1, попытка отмены может привести к внезапному закрытию базового соединения.
- С HTTP/2, попытка отмены может привести к сбросу потока.
- Type Parameters:
T- тип тела ответа- Parameters:
-
request- запрос -
responseBodyHandler- обработчик тела ответа -
pushPromiseHandler- обработчик обещаний, может быть null - Returns:
CompletableFuture<HttpResponse<T>>- Throws:
-
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 Opening Handshake может быть достигнут с помощью пользовательского 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); - Implementation Requirements:
- По умолчанию этот метод выбрасывает
UnsupportedOperationException. Клиенты, полученные черезnewHttpClient()илиnewBuilder()возвращаютWebSocketбилдер. - Implementation Note:
- И билдер, и
WebSocket, созданные с его помощью, работают в асинхронном режиме. То есть их методы не блокируются перед возвращениемCompletableFuture. Асинхронные задачи выполняются в исполнителе этогоHttpClient.Когда
CompletionStage, возвращённое изListener.onCloseзавершается,WebSocketотправит сообщение Close с тем же кодом и пустым описанием причины. - Returns:
WebSocket.Builder- Throws:
-
UnsupportedOperationException- если этотHttpClientне поддерживает WebSocket
shutdown
public void shutdown()
send или sendAsync, выполняются до завершения, но новые запросы не будут приняты. Выполнение запроса до завершения может включать в себя выполнение нескольких операций в фоновом режиме, включая ожидание доставки ответов, которые должны будут завершиться до того, как запрос будет считаться завершённым. Вызов не имеет дополнительного эффекта, если уже закрыт. Этот метод не ждёт завершения ранее отправленных запросов. Используйте awaitTermination или close для этого.
- Implementation Requirements:
- Реализация по умолчанию ничего не делает. Подклассы должны переопределить этот метод для реализации соответствующего поведения.
- Since:
- 21
- See Also:
awaitTermination
public boolean awaitTermination(Duration duration) throws InterruptedException
duration, или текущий поток будет прерван, что произойдёт первым. Операции — это любые задачи, необходимые для выполнения запроса, ранее отправленного с send или sendAsync, до завершения. Этот метод не ждёт, если время ожидания меньше или равно нулю. В этом случае метод просто проверяет, завершился ли поток.
- Implementation Requirements:
- Реализация по умолчанию проверяет аргументы на null, но в остальном ничего не делает и возвращает true. Подклассы должны переопределить этот метод для реализации соответствующего поведения.
- Parameters:
-
duration- максимальное время ожидания - Returns:
-
true, если этот клиент завершился, иfalse, если истекло время ожидания до завершения - Throws:
-
InterruptedException- если прервано во время ожидания - Since:
- 21
- See Also:
isTerminated
public boolean isTerminated()
true, если все операции завершены после запроса на завершение. Операции — это любые задачи, необходимые для выполнения запроса, ранее отправленного с send или sendAsync, до завершения. Обратите внимание, что isTerminated никогда не является true, если не был вызван ни shutdown, ни shutdownNow.
- Implementation Requirements:
- Реализация по умолчанию ничего не делает и возвращает false. Подклассы должны переопределить этот метод для реализации соответствующего поведения.
- Returns:
-
true, если все задачи завершены после запроса на завершение - Since:
- 21
- See Also:
shutdownNow
public void shutdownNow()
send или sendAsync, до завершения. Поведение активно выполняющихся операций при прерывании не определено. В частности, нет гарантии, что прерванные операции завершатся, или что код, ожидающий этих операций, когда-либо получит уведомление.- Implementation Requirements:
- Реализация по умолчанию просто вызывает
shutdown(). Подклассы должны переопределить этот метод для реализации соответствующего поведения. - Since:
- 21
- See Also:
close
public void close()
send или sendAsync, выполняются до завершения, но новые запросы не будут приняты. Выполнение запроса до завершения может включать в себя выполнение нескольких операций в фоновом режиме, включая ожидание доставки ответов. Этот метод ждёт, пока все операции не завершат выполнение и клиент не завершится. Если прерван во время ожидания, этот метод может попытаться остановить все операции, вызвав shutdownNow(). Затем он продолжает ждать, пока все активно выполняющиеся операции не завершатся. Статус прерывания будет восстановлен перед возвратом этого метода.
Если уже завершён, вызов этого метода не имеет эффекта.
- Specified by:
-
closeв интерфейсеAutoCloseable - Implementation Requirements:
- Реализация по умолчанию вызывает
shutdown()и ждёт завершения задач с помощьюawaitTermination. - Since:
- 21
- See Also:
© 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://download.java.net/java/early_access/jdk24/docs/api/java.net.http/java/net/http/HttpClient.html