Spec-Zone.ru › OpenJDK 25

Класс 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);
Примечание к API:
Ресурсы, выделенные HttpClient, могут быть освобождены раньше при закрытии клиента.
Примечание по реализации:

Классы HttpResponse.BodyHandlers и HttpResponse.BodySubscribers предоставляют некоторые реализации BodyHandler и BodySubscriber для потоковой передачи или публикации, позволяющие передавать данные тела потоком обратно вызывающему коду. Чтобы освободить ресурсы, связанные с этими потоками, и считать HTTP-запрос завершённым, вызывающий код должен в конечном итоге получить потоковое тело ответа и закрыть, отменить или полностью прочитать возвращённые потоки. Аналогичным образом, пользовательская реализация HttpResponse.BodySubscriber должна либо запросить все данные до получения сигнала onComplete или onError, либо в конечном итоге отменить свою подписку.

Встроенная реализация HttpClient из JDK переопределяет методы close(), shutdown(), shutdownNow(), awaitTermination(Duration) и isTerminated(), предоставляя их максимально возможную реализацию. Если не закрыть, не отменить или не прочитать streaming or publishing bodies полностью, доставка данных может прекратиться, хотя запрос останется открытым, что может задержать штатное завершение работы. При вызове метода shutdownNow() будет предпринята попытка отменить все такие незавершённые запросы, но это может привести к внезапному прекращению любой выполняющейся операции.

Если встроенная реализация HttpClient из JDK не закрыта явно, она освобождает свои ресурсы, когда экземпляр HttpClient перестаёт быть сильно достижимым и все запущенные на нём операции в конечном итоге завершаются. Для этого сборщик мусора должен обнаружить, что экземпляр больше недостижим, а все запросы, запущенные клиентом, должны в конечном итоге завершиться. Если не закрыть должным образом потоковые тела или тела публикации, связанные запросы могут не завершиться, что помешает сборщику мусора освободить ресурсы, выделенные соответствующим клиентом.

Начиная с версии:
11

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static interface  HttpClient.Builder
Построитель HTTP-клиентов.
static enum  HttpClient.Redirect
Определяет политику автоматического перенаправления.
static enum  HttpClient.Version
Версия протокола HTTP.

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

HttpClient()
Модификатор Конструктор Описание
protected
Создаёт HttpClient.

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

Модификатор и тип Метод Описание
abstract Optional<Authenticator> authenticator()
Возвращает Optional, содержащий Authenticator, заданное для этого клиента.
boolean awaitTermination(Duration duration)
Блокирует выполнение до завершения всех операций после запроса на завершение работы, истечения duration или прерывания текущего потока — в зависимости от того, что произойдёт раньше.
void close()
Инициирует штатное завершение работы: запросы, ранее отправленные с помощью send или sendAsync, выполняются до завершения, но новые запросы приниматься не будут.
abstract Optional<Duration> connectTimeout()
Возвращает Optional, содержащий длительность тайм-аута подключения для этого клиента.
abstract Optional<CookieHandler> cookieHandler()
Возвращает Optional, содержащий CookieHandler этого клиента.
abstract Optional<Executor> 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<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 для этого клиента.

Методы, объявленные в классе 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, политику перенаправления 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 все еще может быть непредоставляемый селектор прокси по умолчанию, используемый для отправки 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 пуст.

Несмотря на то что этот метод может возвращать пустой 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.

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-обещаний.

Если возвращенный CompletableFuture завершается успешно, он завершается с объектом HttpResponse<T>, содержащим статус ответа, заголовки и тело (обработанное указанным обработчиком тела ответа).

Полученные push-обещания, если таковые имеются, обрабатываются указанным pushPromiseHandler. null со значением pushPromiseHandler отклоняет все push-обещания.

Возвращенный CompletableFuture завершается с исключением в следующих случаях:

  • IOException — если при отправке или получении произошла ошибка ввода-вывода либо клиент был остановлен.

Реализация HttpClient по умолчанию возвращает объекты CompletableFuture, которые можно отменить. Объекты CompletableFuture, созданные на основе отменяемых future, сами также можно отменить. Вызов cancel(true) для отменяемого future, которое еще не завершено, пытается отменить обмен 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
См. также:
  • Примечание по реализации: закрытие HttpClient

awaitTermination

public boolean awaitTermination(Duration duration) throws InterruptedException
Блокирует выполнение до завершения всех операций после запроса на завершение работы, истечения duration или прерывания текущего потока с помощью interrupt — в зависимости от того, что произойдет первым. Операциями считаются любые задачи, необходимые для полного выполнения запроса, ранее отправленного с помощью send или sendAsync.

Этот метод не ожидает завершения, если длительность ожидания меньше или равна нулю. В этом случае метод просто проверяет, завершился ли поток.

Требования к реализации:
Реализация этого метода по умолчанию проверяет аргументы на null, но в остальном ничего не делает и возвращает true. Подклассам следует переопределить этот метод, чтобы реализовать надлежащее поведение.
Параметры:
duration — максимальное время ожидания
Возвращает:
true, если работа этого клиента завершилась, и false, если время ожидания истекло до завершения
Выбрасывает:
InterruptedException — если во время ожидания произошло прерывание
С версии:
21
См. также:
  • Примечание по реализации: закрытие HttpClient

isTerminated

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

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

Требования к реализации:
Реализация этого метода по умолчанию ничего не делает и возвращает false. Подклассам следует переопределить этот метод, чтобы реализовать надлежащее поведение.
Возвращает:
true, если после завершения работы все задачи выполнены
С версии:
21
См. также:
  • Примечание по реализации: закрытие HttpClient

shutdownNow

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

close

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

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

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

Определен в:
close в интерфейсе AutoCloseable
Требования к реализации:
Реализация по умолчанию вызывает shutdown() и ожидает завершения задач с помощью awaitTermination.
С версии:
21
См. также:
  • Примечание по реализации: закрытие HttpClient

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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://docs.oracle.com/en/java/javase/25/docs/api/java.net.http/java/net/http/HttpClient.html

Spec-Zone.ru

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