Класс 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); Если менеджер безопасности присутствует, то проверки безопасности выполняются методами отправки HTTP-клиента. Для доступа к целевому серверу и прокси-серверу (если он был настроен) требуется соответствующее разрешение URLPermission. Форма URLPermission разрешения доступа к прокси имеет параметр method со значением "CONNECT" (для всех типов проксирования) и строку URL вида "socket://host:port", где host и port указывают адрес прокси-сервера.
- Примечание API:
- Ресурсы, выделенные
HttpClient, могут быть освобождены раньше путём закрытия клиента. - Примечание реализации:
-
Встроенная в JDK реализация
HttpClientпереопределяетclose(),shutdown(),shutdownNow(),awaitTermination(Duration)иisTerminated(), чтобы обеспечить наилучшую реализацию. Отсутствие закрытия, отмены или чтения возвращенных потоков до завершения, таких как потоки, предоставляемые при использованииHttpResponse.BodyHandlers.ofInputStream(),HttpResponse.BodyHandlers.ofLines()илиHttpResponse.BodyHandlers.ofPublisher(), может помешать выполнению запросов, отправленных до упорядоченной остановки. Аналогично, отсутствие запроса данных или отмены подписки от пользовательского BodySubscriber может остановить доставку данных и приостановить упорядоченную остановку.Если для
HttpClientне был явно задан executor, и менеджер безопасности установлен, то по умолчанию асинхронные и зависимые задачи будут выполняться в контексте, которому не предоставлены разрешения. Пользовательские request body publishers, response body handlers, response body subscribers и WebSocket Listeners, если они выполняют операции, требующие привилегий, должны делать это в соответствующем privileged context. - С:
- 11
Краткое описание вложенных классов
| Modifier and Type | Class | Description |
|---|---|---|
static interface |
HttpClient.Builder |
Построитель HTTP-клиентов. |
static enum |
HttpClient.Redirect |
Определяет политику автоматического перенаправления. |
static enum |
HttpClient.Version |
Версия HTTP-протокола. |
Краткое описание конструкторов
| Modifier | Конструктор | Description |
|---|---|---|
protected |
Создает HttpClient. |
Краткое описание методов
| Modifier and Type | Метод | Description |
|---|---|---|
abstract Optional |
authenticator() |
Возвращает Optional содержащий Authenticator, установленный в этом клиенте. |
boolean |
awaitTermination |
Ожидает завершения всех операций после запроса на остановку, или истечения duration, или прерывания текущей нити interrupt, в зависимости от того, что произойдет раньше. |
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 builder. |
static HttpClient |
newHttpClient() |
Возвращает новый HttpClient с настройками по умолчанию. |
WebSocket.Builder |
newWebSocketBuilder() |
Создает новый WebSocket builder (необязательная операция). |
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, политику перенаправления НИКОГДА, стандартный селектор прокси и стандартный 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 пустой. Несмотря на то, что этот метод может вернуть пустой опциональный,
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 пустой. Несмотря на то, что этот метод может вернуть пустой опциональный,
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. -
SecurityException- Если установлен менеджер безопасности и он отказывается отaccessдля URL в заданном запросе или прокси, если он настроен. См. проверки безопасности для получения дополнительной информации.
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> содержащим статус ответа, заголовки и тело (обработанное заданным обработчиком тела ответа).
Полученные, если таковые имеются, push-обязательства обрабатываются заданным pushPromiseHandler. null значение pushPromiseHandler отклоняет любые push-обязательства.
Возвращаемое выполнимое будущее завершается исключением:
-
IOException- если при отправке или приёме возникает ошибка ввода-вывода, или клиент закрылся. -
SecurityException- Если установлен менеджер безопасности, и он запрещаетaccessдля URL в заданном запросе, или прокси, если он настроен. Дополнительную информацию см. в разделе проверки безопасности.
Реализация HttpClient по умолчанию возвращает CompletableFuture объекты, которые являются отменяемыми. CompletableFuture объекты, полученные от отменяемых будущих, сами являются отменяемыми. Вызов cancel(true) на отменяемом будущем, которое не завершено, пытается отменить обмен HTTP в попытке высвободить основанные ресурсы как можно скорее. Никаких гарантий не даётся относительно точного момента, когда запрос на отмену может быть учтён. В частности, запрос может всё ещё быть отправлен на сервер, так как его обработка уже могла начаться асинхронно в другом потоке, а основанные ресурсы могут быть высвобождены асинхронно.
- С HTTP/1.1, попытка отмены может привести к прерывистому закрытию базового соединения.
- С HTTP/2, попытка отмены может привести к сбросу потока.
- Type Parameters:
-
T- тип тела ответа - Parameters:
-
request- запрос -
responseBodyHandler- обработчик тела ответа -
pushPromiseHandler- обработчик запросов к push-обязательствам, может быть null - Returns:
- выполнимое будущее
- 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 можно достичь с помощью настраиваемого 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отправит сообщение Закрыть, которое имеет тот же код, что и полученное сообщение, и пустое описание причины. - 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, 2023, 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/21/docs/api/java.net.http/java/net/http/HttpClient.html