Класс HttpClient
public abstract class HttpClient extends Object
Клиент HTTP HttpClient может быть использован для отправки запросов и получения их ответов. Клиент
HttpClient создается с помощью builder. Метод newBuilder возвращает билдер, создающий экземпляры по умолчанию HttpClient реализации. Билдер позволяет настроить состояние клиента, например: предпочтительную версию протокола (HTTP/1.1 или HTTP/2), следовать ли редиректам, использовать прокси, аутентификатор и т.д. После построения, клиент 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 указывают адрес прокси.
- Прим. реализации:
- Если для клиента
HttpClientне был явно задан executor, и менеджер безопасности установлен, то по умолчанию асинхронные и зависимые задачи будут выполняться в контексте без прав доступа. Пользовательские публикаторы тела запроса, обработчики тела ответа, подписчики на тело ответа и WebSocket слушатели, если они выполняют операции, требующие прав, должны делать это в соответствующем привилегированном контексте. - С момента:
- 11
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static interface |
HttpClient.Builder |
Билдер клиентов HTTP. |
static enum |
HttpClient.Redirect |
Определяет политику автоматического перенаправления. |
static enum |
HttpClient.Version |
Версия протокола HTTP. |
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Создаёт HttpClient. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Optional<Authenticator> |
authenticator() |
Возвращает Optional, содержащий Authenticator, установленный для этого клиента. |
abstract Optional<Duration> |
connectTimeout() |
Возвращает Optional, содержащий время ожидания соединения для этого клиента. |
abstract Optional<CookieHandler> |
cookieHandler() |
Возвращает Optional, содержащий CookieHandler этого клиента. |
abstract Optional<Executor> |
executor() |
Возвращает Optional, содержащий Executor этого клиента. |
abstract HttpClient.Redirect |
followRedirects() |
Возвращает политику следования редиректам для этого клиента. |
static HttpClient.Builder |
newBuilder() |
Создаёт новый билдер HttpClient. |
static HttpClient |
newHttpClient() |
Возвращает новый билдер HttpClient с настройками по умолчанию. |
WebSocket.Builder |
newWebSocketBuilder() |
Создаёт новый билдер WebSocket (необязательная операция). |
abstract Optional<ProxySelector> |
proxy() |
Возвращает Optional, содержащий ProxySelector предоставленный для этого клиента. |
abstract <T> HttpResponse<T> |
send |
Отправляет данный запрос с помощью этого клиента, блокируя выполнение, если необходимо, для получения ответа. |
abstract <T> CompletableFuture<HttpResponse<T>> |
sendAsync |
Отправляет данный запрос асинхронно с помощью этого клиента с указанным обработчиком тела ответа. |
abstract <T> CompletableFuture<HttpResponse<T>> |
sendAsync |
Отправляет данный запрос асинхронно с помощью этого клиента с указанным обработчиком тела ответа и обработчиком push-обещаний. |
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 пуст. Несмотря на то, что этот метод может возвращать пустой 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 может содержать неэкспонированный стандартный executor, используемый для выполнения асинхронных и зависимых задач.
- Возвращает:
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> содержащим статус ответа, заголовки и тело (как обрабатывается заданным обработчиком тела ответа).
Полученные, если таковые имеются, запросы на передачу данных обрабатываются заданным pushPromiseHandler. null значение pushPromiseHandler отклоняет все запросы на передачу данных.
Возвращаемое завершаемое будущее завершается с ошибкой:
-
IOException- если при отправке или приёме возникает ошибка ввода-вывода -
SecurityException- если установлен менеджер безопасности и он запрещаетaccessдля URL в данном запросе, или для прокси, если он настроен. Дополнительную информацию см. в разделе проверки безопасности.
Реализация по умолчанию HttpClient возвращает CompletableFuture объекты, которые являются отменяемыми. CompletableFuture объекты производные от отменяемых будущих сами являются отменяемыми. Вызов cancel(true) на отменяемом будущем, которое не завершено, пытается отменить HTTP обмен, чтобы как можно скорее освободить базовые ресурсы. Никаких гарантий относительно точности момента, когда запрос на отмену будет учтён, не даётся. В частности, запрос может всё ещё быть отправлен на сервер, так как его обработка может уже начаться асинхронно в другом потоке, а освобождение базовых ресурсов может произойти асинхронно.
- При использовании HTTP/1.1 попытка отмены может привести к внезапному закрытию базового соединения.
- При использовании HTTP/2 попытка отмены может привести к сбросу потока.
- Type Parameters:
-
T- тип тела ответа - Parameters:
-
request- запрос -
responseBodyHandler- обработчик тела ответа -
pushPromiseHandler- обработчик запросов на передачу данных, может быть 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отправит сообщение Close с таким же кодом и пустым сообщением об ошибке. - Returns:
WebSocket.Builder- Throws:
-
UnsupportedOperationException- если этотHttpClientне поддерживает WebSocket
© 1993, 2021, 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/17/docs/api/java.net.http/java/net/http/HttpClient.html