Spec-Zone.ru › OpenJDK 21

Класс HttpClient

java.lang.Object
java.net.http.HttpClient
Все реализованные интерфейсы:
AutoCloseable
public abstract class HttpClient extends Object implements AutoCloseable
Клиент HTTP.

Объект типа 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-протокола.

Краткое описание конструкторов

HttpClient()
Modifier Конструктор Description
protected
Создает HttpClient.

Краткое описание методов

Modifier and Type Метод Description
abstract Optional<Authenticator> authenticator()
Возвращает Optional содержащий Authenticator, установленный в этом клиенте.
boolean awaitTermination(Duration duration)
Ожидает завершения всех операций после запроса на остановку, или истечения duration, или прерывания текущей нити interrupt, в зависимости от того, что произойдет раньше.
void close()
Инициирует упорядоченную остановку, в которой запросы, ранее отправленные в send или sendAsync, выполняются до конца, но новые запросы не принимаются.
abstract Optional<Duration> connectTimeout()
Возвращает Optional содержащий время ожидания подключения для этого клиента.
abstract Optional<CookieHandler> cookieHandler()
Возвращает Optional содержащий обработчик cookie-файлов CookieHandler этого клиента.
abstract Optional<Executor> 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<ProxySelector> proxy()
Возвращает Optional содержащий ProxySelector предоставленный этому клиенту.
abstract <T> HttpResponse<T> send(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
Отправляет указанный запрос с помощью этого клиента, блокируя, если необходимо, для получения ответа.
abstract <T> CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
Отправляет указанный запрос асинхронно с помощью этого клиента с заданным обработчиком тела ответа.
abstract <T> CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler, HttpResponse.PushPromiseHandler<T> pushPromiseHandler)
Отправляет указанный запрос асинхронно с помощью этого клиента с заданным обработчиком тела ответа и обработчиком push-обещания.
void shutdown()
Инициирует упорядоченную остановку, в которой запросы, ранее отправленные с помощью send или sendAsync, выполняются до конца, но новые запросы не принимаются.
void shutdownNow()
Этот метод пытается инициировать немедленную остановку.
abstract SSLContext sslContext()
Возвращает SSLContext этого клиента.
abstract SSLParameters sslParameters()
Возвращает копию SSLParameters этого клиента.
abstract HttpClient.Version version()
Возвращает предпочтительную версию HTTP-протокола для этого клиента.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

HttpClient

protected HttpClient()
Создаёт 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()
Возвращает предпочтительную версию протокола HTTP для этого клиента. Значение по умолчанию — 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)
Отправляет данный запрос асинхронно с использованием этого клиента с заданным обработчиком тела ответа и обработчиком запросов к push-обязательствам.

Возвращаемое выполнимое будущее, если завершится успешно, завершится с 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:
  • Implementation Note on closing the HttpClient

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:
  • Implementation Note on closing the HttpClient

isTerminated

public boolean isTerminated()
Возвращает true если все операции завершились после запроса на остановку. Операции — это любые задачи, необходимые для выполнения запроса, ранее отправленного с помощью send или sendAsync, до завершения.

Обратите внимание, что isTerminated никогда не true, пока не будет вызван либо shutdown или shutdownNow.

Implementation Requirements:
Реализация по умолчанию этого метода ничего не делает и возвращает false. Подклассы должны переопределить этот метод, чтобы реализовать правильное поведение.
Returns:
true если все задачи завершились после запроса на остановку
Since:
21
See Also:
  • Implementation Note on closing the HttpClient

shutdownNow

public void shutdownNow()
Этот метод пытается инициировать немедленное завершение. Реализация этого метода может попытаться прервать выполняющиеся операции. Операции — это любые задачи, необходимые для выполнения запроса, ранее отправленного с помощью send или sendAsync до завершения. Поведение активно выполняющихся операций при прерывании не определено. В частности, нет гарантии, что прерванные операции завершатся или что код, ожидающий этих операций, когда-либо получит уведомление.
Implementation Requirements:
Реализация по умолчанию этого метода просто вызывает shutdown(). Подклассы должны переопределить этот метод, чтобы реализовать соответствующее поведение.
Since:
21
See Also:
  • Implementation Note on closing the HttpClient

close

public void close()
Инициирует упорядоченное завершение, в котором запросы, ранее отправленные в send или sendAsync, выполняются до завершения, но новые запросы не будут приниматься. Выполнение запроса до завершения может включать выполнение нескольких операций в фоновом режиме, включая ожидание доставки ответов. Этот метод ждёт, пока все операции завершат выполнение, и клиент завершится.

Если прерван во время ожидания, этот метод может попытаться остановить все операции, вызвав shutdownNow(). Затем он продолжает ждать, пока все активно выполняющиеся операции завершатся. Статус прерывания будет восстановлен перед возвращением этого метода.

Если уже завершён, вызов этого метода не оказывает влияния.

Specified by:
close в интерфейсе AutoCloseable
Implementation Requirements:
Реализация по умолчанию вызывает shutdown() и ждёт завершения задач с помощью awaitTermination.
Since:
21
See Also:
  • Implementation Note on closing the HttpClient

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API