Spec-Zone.ru › OpenJDK 25

Класс HttpResponse.BodySubscribers

java.lang.Object
java.net.http.HttpResponse.BodySubscribers
Внешний интерфейс:
HttpResponse<T>
public static class HttpResponse.BodySubscribers extends Object
Реализации BodySubscriber, реализующие различные полезные подписчики, например преобразующие байты тела ответа в строку или передающие байты в файл.

Ниже приведены примеры использования предопределённых подписчиков тела для преобразования потока данных тела ответа в распространённые высокоуровневые объекты Java:

// Streams the response body to a File
HttpResponse<Path> response = client
  .send(request, responseInfo -> BodySubscribers.ofFile(Paths.get("example.html"));
// Accumulates the response body and returns it as a byte[]
HttpResponse<byte[]> response = client
  .send(request, responseInfo -> BodySubscribers.ofByteArray());
// Discards the response body
HttpResponse<Void> response = client
  .send(request, responseInfo -> BodySubscribers.discarding());
// Accumulates the response body as a String then maps it to its bytes
HttpResponse<byte[]> response = client
  .send(request, responseInfo ->
     BodySubscribers.mapping(BodySubscribers.ofString(UTF_8), String::getBytes));
Примечание к API:

Некоторые реализации тела, созданные подписчиками тела, могут передавать байты ответа вызывающему коду в потоковом режиме. Такие реализации обычно являются AutoCloseable, и для освобождения ресурсов, связанных с запросом и клиентом, может потребоваться явно закрыть их, чтобы ресурсы в конечном итоге были освобождены. Некоторые другие реализации являются издателями, на которых необходимо подписаться, чтобы освободить связанные с ними ресурсы и обеспечить завершение связанного запроса.

Начиная с:
11

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

Модификатор и тип Метод Описание
static <T> HttpResponse.BodySubscriber<T> buffering(HttpResponse.BodySubscriber<T> downstream, int bufferSize)
Возвращает BodySubscriber, который буферизует данные перед их передачей указанному нижестоящему подписчику.
static HttpResponse.BodySubscriber<Void> discarding()
Возвращает подписчика ответа, который отбрасывает тело ответа.
static HttpResponse.BodySubscriber<Void> fromLineSubscriber(Flow.Subscriber<? super String> subscriber)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber построчно.
static <S extends Flow.Subscriber<? super String>, T>
HttpResponse.BodySubscriber<T>
fromLineSubscriber(S subscriber, Function<? super S, ? extends T> finisher, Charset charset, String lineSeparator)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber построчно.
static HttpResponse.BodySubscriber<Void> fromSubscriber(Flow.Subscriber<? super List<ByteBuffer>> subscriber)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber.
static <S extends Flow.Subscriber<? super List<ByteBuffer>>, T>
HttpResponse.BodySubscriber<T>
fromSubscriber(S subscriber, Function<? super S, ? extends T> finisher)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber.
static <T> HttpResponse.BodySubscriber<T> limiting(HttpResponse.BodySubscriber<T> downstreamSubscriber, long capacity)
Возвращает BodySubscriber, ограничивающий количество байтов тела, передаваемых указанному downstreamSubscriber.
static <T,U> HttpResponse.BodySubscriber<U> mapping(HttpResponse.BodySubscriber<T> upstream, Function<? super T, ? extends U> mapper)
Возвращает BodySubscriber, значение тела ответа которого является результатом применения заданной функции к объекту тела указанного upstream BodySubscriber.
static HttpResponse.BodySubscriber<byte[]> ofByteArray()
Возвращает BodySubscriber, который сохраняет тело ответа в виде массива байтов.
static HttpResponse.BodySubscriber<Void> ofByteArrayConsumer(Consumer<Optional<byte[]>> consumer)
Возвращает BodySubscriber, который передаёт входящие данные тела указанному потребителю Optional<byte[]>.
static HttpResponse.BodySubscriber<Path> ofFile(Path file)
Возвращает BodySubscriber, который сохраняет тело ответа в файл, открытый с указанным именем.
static HttpResponse.BodySubscriber<Path> ofFile(Path file, OpenOption... openOptions)
Возвращает BodySubscriber, который сохраняет тело ответа в файл, открытый с указанными параметрами и именем.
static HttpResponse.BodySubscriber<InputStream> ofInputStream()
Возвращает BodySubscriber, который передаёт тело ответа в виде InputStream.
static HttpResponse.BodySubscriber<Stream<String>> ofLines(Charset charset)
Возвращает BodySubscriber, который передаёт тело ответа в виде Stream<String>, где каждая строка в потоке соответствует строке, определённой методом BufferedReader.lines().
static HttpResponse.BodySubscriber<Flow.Publisher<List<ByteBuffer>>> ofPublisher()
Возвращает подписчика ответа, который публикует тело ответа через Publisher<List<ByteBuffer>>.
static HttpResponse.BodySubscriber<String> ofString(Charset charset)
Возвращает подписчика тела, который сохраняет тело ответа в виде String, преобразованного с помощью заданного Charset.
static <U> HttpResponse.BodySubscriber<U> replacing(U value)
Возвращает подписчика ответа, который отбрасывает тело ответа.

Методы, объявленные в классе Object

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

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

fromSubscriber

public static HttpResponse.BodySubscriber<Void> fromSubscriber(Flow.Subscriber<? super List<ByteBuffer>> subscriber)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber. Стадия завершения возвращённого подписчика тела завершается после вызова одного из методов указанного подписчика: onComplete или onError.
Примечание к API:
Этот метод можно использовать в качестве адаптера между BodySubscriber и Flow.Subscriber.
Параметры:
subscriber — подписчик
Возвращает:
подписчик тела

fromSubscriber

public static <S extends Flow.Subscriber<? super List<ByteBuffer>>, T> HttpResponse.BodySubscriber<T> fromSubscriber(S subscriber, Function<? super S, ? extends T> finisher)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber. Стадия завершения возвращённого подписчика тела завершается после вызова одного из методов указанного подписчика: onComplete или onError.

Заданная функция finisher применяется после вызова onComplete указанного подписчика. Функция finisher вызывается с указанным подписчиком и возвращает значение, устанавливаемое в качестве тела ответа.

Примечание к API:
Этот метод можно использовать в качестве адаптера между BodySubscriber и Flow.Subscriber.
Параметры типа:
S — тип подписчика
T — тип тела ответа
Параметры:
subscriber — подписчик
finisher — функция, применяемая после завершения работы подписчика
Возвращает:
подписчик тела

fromLineSubscriber

public static HttpResponse.BodySubscriber<Void> fromLineSubscriber(Flow.Subscriber<? super String> subscriber)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber построчно. Стадия завершения возвращённого подписчика тела завершается после вызова одного из методов указанного подписчика: onComplete или onError. Байты декодируются с использованием кодировки UTF-8, а строки разделяются так же, как в методе BufferedReader.readLine().
Примечание к API:
Этот метод можно использовать в качестве адаптера между BodySubscriber и Flow.Subscriber.
Примечание по реализации:
Этот метод эквивалентен вызову
fromLineSubscriber(subscriber, s -> null, StandardCharsets.UTF_8, null)
Параметры:
subscriber — подписчик
Возвращает:
подписчик тела

fromLineSubscriber

public static <S extends Flow.Subscriber<? super String>, T> HttpResponse.BodySubscriber<T> fromLineSubscriber(S subscriber, Function<? super S, ? extends T> finisher, Charset charset, String lineSeparator)
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber построчно. Стадия завершения возвращённого подписчика тела завершается после вызова одного из методов указанного подписчика: onComplete или onError.

Заданная функция finisher применяется после вызова onComplete указанного подписчика. Функция finisher вызывается с указанным подписчиком и возвращает значение, устанавливаемое в качестве тела ответа.

Примечание к API:
Этот метод можно использовать в качестве адаптера между BodySubscriber и Flow.Subscriber.
Параметры типа:
S — тип подписчика
T — тип тела ответа
Параметры:
subscriber — подписчик
finisher — функция, применяемая после завершения работы подписчика
charset — Charset для декодирования байтов
lineSeparator — необязательный разделитель строк: может быть null, и в этом случае строки будут разделяться так же, как в методе BufferedReader.readLine().
Возвращает:
подписчик тела
Вызывает:
IllegalArgumentException — если указанное значение lineSeparator является пустой строкой

ofString

public static HttpResponse.BodySubscriber<String> ofString(Charset charset)
Возвращает подписчика тела, который сохраняет тело ответа в виде String, преобразованной с помощью заданной Charset.

HttpResponse, использующий этот подписчик, становится доступен после чтения всего ответа.

Параметры:
charset — набор символов для преобразования String
Возвращает:
подписчик тела

ofByteArray

public static HttpResponse.BodySubscriber<byte[]> ofByteArray()
Возвращает BodySubscriber, который сохраняет тело ответа в виде массива байтов.

HttpResponse, использующий этот подписчик, становится доступен после чтения всего ответа.

Возвращает:
подписчик тела

ofFile

public static HttpResponse.BodySubscriber<Path> ofFile(Path file, OpenOption... openOptions)
Возвращает BodySubscriber, который сохраняет тело ответа в файл, открытый с указанными параметрами и именем. Файл будет открыт с указанными параметрами с помощью FileChannel.open непосредственно перед чтением тела. Любое возникшее исключение будет возвращено или выброшено из HttpClient::send или HttpClient::sendAsync, в зависимости от ситуации.

HttpResponse, использующий этот подписчик, становится доступен после чтения всего ответа.

Параметры:
file — файл для сохранения тела
openOptions — список параметров открытия файла
Возвращает:
подписчик тела
Вызывает:
IllegalArgumentException — если указан недопустимый набор параметров открытия

ofFile

public static HttpResponse.BodySubscriber<Path> ofFile(Path file)
Возвращает BodySubscriber, который сохраняет тело ответа в файл, открытый с указанным именем.

Эквивалентно: ofFile(file, CREATE, WRITE)

Параметры:
file — файл для сохранения тела
Возвращает:
подписчик тела

ofByteArrayConsumer

public static HttpResponse.BodySubscriber<Void> ofByteArrayConsumer(Consumer<Optional<byte[]>> consumer)
Возвращает BodySubscriber, который передаёт входящие данные тела предоставленному потребителю Optional<byte[]>. Каждый вызов Consumer.accept() будет содержать непустой Optional, за исключением последнего вызова после чтения всех данных тела, когда Optional будет пустым.

HttpResponse, использующий этот подписчик, становится доступен после чтения всего ответа.

Примечание к API:
Этот подписчик не управляет потоком данных. Поэтому предоставленный потребитель должен своевременно обрабатывать любой объём переданных данных.
Параметры:
consumer — потребитель массивов байтов
Возвращает:
подписчик тела

ofInputStream

public static HttpResponse.BodySubscriber<InputStream> ofInputStream()
Возвращает BodySubscriber, который передаёт тело ответа в виде InputStream.

HttpResponse, использующий этот подписчик, становится доступен сразу после чтения заголовков ответа, без необходимости ждать обработки всего тела. После этого тело ответа можно читать непосредственно из InputStream.

Примечание к API:
Чтобы обеспечить корректное освобождение всех ресурсов, связанных с соответствующим обменом, вызывающий код должен либо прочитать все байты до достижения EOF, либо вызвать InputStream.close(), если он не может или не желает этого делать. Вызов close до исчерпания потока может привести к закрытию базового HTTP-соединения и помешать его повторному использованию для последующих операций.
Примечание по реализации:
Метод read объекта InputStream, возвращаемого реализацией этого метода по умолчанию, выбрасывает IOException с установленным флагом прерывания потока, если поток прерывается во время блокировки при чтении. В этом случае запрос также будет отменён, а InputStream будет закрыт.
Возвращает:
подписчик потокового тела, который передаёт тело ответа в виде InputStream.

ofLines

public static HttpResponse.BodySubscriber<Stream<String>> ofLines(Charset charset)
Возвращает BodySubscriber, который передаёт тело ответа в виде Stream<String>, где каждая строка в потоке соответствует строке, определённой методом BufferedReader.lines().

HttpResponse, использующий этот подписчик, становится доступен сразу после чтения заголовков ответа, без необходимости ждать обработки всего тела. После этого тело ответа можно читать непосредственно из Stream.

Примечание к API:
Чтобы обеспечить корректное освобождение всех ресурсов, связанных с соответствующим обменом, вызывающий код должен либо прочитать все строки до исчерпания потока, либо вызвать BaseStream.close(), если он не может или не желает этого делать. Вызов close до исчерпания потока может привести к закрытию базового HTTP-соединения и помешать его повторному использованию для последующих операций.
Параметры:
charset — набор символов для преобразования байтов в символы
Возвращает:
подписчик потокового тела, который передаёт тело ответа в виде Stream<String>.
См. также:
  • BufferedReader.lines()

ofPublisher

public static HttpResponse.BodySubscriber<Flow.Publisher<List<ByteBuffer>>> ofPublisher()
Возвращает подписчика ответа, который публикует тело ответа через Publisher<List<ByteBuffer>>.

HttpResponse, использующий этот подписчик, становится доступен сразу после чтения заголовков ответа, без необходимости ждать обработки всего тела. Затем байты тела ответа можно получить, подписавшись на издателя, возвращаемого методом HttpResponse body.

На издателя, возвращаемого методом body, можно подписаться только один раз. Первый подписчик получит байты тела ответа, если подписка будет успешно оформлена; в противном случае подписка будет отменена. При попытке оформить дополнительные подписки последующие подписчики немедленно получат пустую подписку, а их метод onError будет вызван с IllegalStateException.

Примечание к API:
Чтобы обеспечить корректное освобождение всех ресурсов, связанных с соответствующим обменом, вызывающий код должен один раз подписаться на предоставленного издателя и либо запросить все байты до вызова onComplete или onError, либо отменить предоставленную подписку, если он не может или не желает этого делать. Обратите внимание, что в зависимости от фактической версии версии HTTP, используемой для обмена, отмена подписки вместо исчерпания потока может привести к закрытию базового HTTP-соединения и помешать его повторному использованию для последующих операций.
Возвращает:
подписчик, публикующий тело, который публикует тело ответа через Publisher<List<ByteBuffer>>.

replacing

public static <U> HttpResponse.BodySubscriber<U> replacing(U value)
Возвращает подписчика ответа, который отбрасывает тело ответа. Предоставленное значение — это значение, которое будет возвращено методом HttpResponse.body().
Параметры типа:
U — тип тела ответа
Параметры:
value — значение, возвращаемое методом HttpResponse.body(); может быть null
Возвращает:
подписчик тела

discarding

public static HttpResponse.BodySubscriber<Void> discarding()
Возвращает подписчика ответа, который отбрасывает тело ответа.
Возвращает:
подписчик тела ответа

buffering

public static <T> HttpResponse.BodySubscriber<T> buffering(HttpResponse.BodySubscriber<T> downstream, int bufferSize)
Возвращает BodySubscriber, который буферизует данные перед их передачей указанному нижестоящему подписчику. Подписчик гарантирует передачу bufferSize байтов данных при каждом вызове метода onNext нижестоящего подписчика, кроме последнего вызова непосредственно перед вызовом onComplete. Последний вызов onNext может содержать меньше bufferSize байтов.

Возвращённый подписчик делегирует нижестоящему подписчику вызов своего метода getBody().

Параметры типа:
T — тип тела ответа
Параметры:
downstream — нижестоящий подписчик
bufferSize — размер буфера
Возвращает:
подписчик тела с буферизацией
Вызывает:
IllegalArgumentException — если bufferSize <= 0

mapping

public static <T,U> HttpResponse.BodySubscriber<U> mapping(HttpResponse.BodySubscriber<T> upstream, Function<? super T, ? extends U> mapper)
Возвращает BodySubscriber, значение тела ответа которого является результатом применения заданной функции к объекту тела указанного upstream BodySubscriber.

Функция отображения выполняется с помощью исполнителя клиента, поэтому её можно использовать для отображения любого типа тела ответа, в том числе блокирующего InputStream. Однако любая блокирующая операция в функции отображения может заблокировать поток исполнителя на неизвестное время (по крайней мере до завершения блокирующей операции), что может привести к нехватке доступных потоков исполнителя. Поэтому, если отображение в нужный тип может быть блокирующим (например, при чтении из InputStream), предпочтительно отображать данные в Supplier нужного типа и откладывать блокирующую операцию до вызова Supplier::get потоком вызывающего кода, как показано в следующем примере, где известный анализатор JSON преобразует InputStream в любой аннотированный тип Java.

Например:

 public static <W> BodySubscriber<Supplier<W>> asJSON(Class<W> targetType) {
   BodySubscriber<InputStream> upstream = BodySubscribers.ofInputStream();

   BodySubscriber<Supplier<W>> downstream = BodySubscribers.mapping(
         upstream,
         (InputStream is) -> () -> {
             try (InputStream stream = is) {
                 ObjectMapper objectMapper = new ObjectMapper();
                 return objectMapper.readValue(stream, targetType);
             } catch (IOException e) {
                 throw new UncheckedIOException(e);
             }
         });
  return downstream;
}
Параметры типа:
T — тип исходного тела
U — тип возвращаемого подписчика тела
Параметры:
upstream — подписчик тела для отображения
mapper — функция отображения
Возвращает:
подписчик тела с отображением

limiting

public static <T> HttpResponse.BodySubscriber<T> limiting(HttpResponse.BodySubscriber<T> downstreamSubscriber, long capacity)
Возвращает BodySubscriber, ограничивающий количество байтов тела, передаваемых указанному downstreamSubscriber.

Если число полученных байтов тела превышает заданное значение capacity, для нижестоящего BodySubscriber вызывается onError с объектом IOException, указывающим на превышение лимита, а подписка на вышестоящий поток отменяется.

Параметры:
downstreamSubscriber — нижестоящий подписчик, которому передаются полученные данные
capacity — максимально допустимое количество байтов
Возвращает:
BodySubscriber, ограничивающий количество байтов тела, передаваемых указанному downstreamSubscriber
Вызывает:
IllegalArgumentException — если значение capacity отрицательно
Начиная с:
25

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по 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/HttpResponse.BodySubscribers.html

Spec-Zone.ru

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