Spec-Zone.ru › OpenJDK 27

Класс 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
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии.
Финализация признана устаревшей и будет удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать до тех пор, пока он не будет разбужен, обычно посредством уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать до тех пор, пока он не будет разбужен, обычно посредством уведомления или прерывания, либо пока не истечёт заданный промежуток реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать до тех пор, пока он не будет разбужен, обычно посредством уведомления или прерывания, либо пока не истечёт заданный промежуток реального времени.

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

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 — набор символов для преобразования строки
Возвращает:
подписчик тела ответа

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-соединения и помешать его повторному использованию для последующих операций.
Возвращает:
Подписчик тела ответа с публикацией, который публикует тело ответа через 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, метод onError вызывается для нижестоящего BodySubscriber с объектом IOException, указывающим на превышение ёмкости, а подписка на вышестоящий поток отменяется.

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

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, 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.

Spec-Zone.ru

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