Класс 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 |
buffering |
Возвращает BodySubscriber, который буферизует данные перед их передачей указанному нижестоящему подписчику. |
static HttpResponse.BodySubscriber |
discarding() |
Возвращает подписчика ответа, который отбрасывает тело ответа. |
static HttpResponse.BodySubscriber |
fromLineSubscriber |
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber построчно. |
static <S extends Flow.Subscriber<? super String>, T> |
fromLineSubscriber |
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber построчно. |
static HttpResponse.BodySubscriber |
fromSubscriber |
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber. |
static <S extends Flow.Subscriber<? super List<ByteBuffer>>, T> |
fromSubscriber |
Возвращает подписчика тела, который передаёт всё тело ответа указанному Flow.Subscriber. |
static <T> HttpResponse.BodySubscriber |
limiting |
Возвращает BodySubscriber, который ограничивает количество байтов тела, передаваемых указанному downstreamSubscriber. |
static <T, |
mapping |
Возвращает BodySubscriber, значение тела ответа которого является результатом применения указанной функции к объекту тела указанного upstream BodySubscriber. |
static HttpResponse.BodySubscriber |
ofByteArray() |
Возвращает BodySubscriber, который сохраняет тело ответа в виде массива байтов. |
static HttpResponse.BodySubscriber |
ofByteArrayConsumer |
Возвращает BodySubscriber, который передаёт входящие данные тела предоставленному потребителю Optional<byte[]>. |
static HttpResponse.BodySubscriber |
ofFile |
Возвращает BodySubscriber, который сохраняет тело ответа в файле, открытом с указанным именем. |
static HttpResponse.BodySubscriber |
ofFile |
Возвращает BodySubscriber, который сохраняет тело ответа в файле, открытом с указанными параметрами и именем. |
static HttpResponse.BodySubscriber |
ofInputStream() |
Возвращает BodySubscriber, который передаёт тело ответа в потоковом режиме как InputStream. |
static HttpResponse.BodySubscriber |
ofLines |
Возвращает BodySubscriber, который передаёт тело ответа в потоковом режиме как Stream<String>, где каждая строка в потоке соответствует строке в смысле определения BufferedReader.lines(). |
static HttpResponse.BodySubscriber |
ofPublisher() |
Возвращает подписчика ответа, который публикует тело ответа через Publisher<List<ByteBuffer>>. |
static HttpResponse.BodySubscriber |
ofString |
Возвращает подписчика тела, который сохраняет тело ответа в виде
String, преобразованного с помощью указанного Charset. |
static <U> HttpResponse.BodySubscriber |
replacing |
Возвращает подписчика ответа, который отбрасывает тело ответа. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация признана устаревшей и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать до тех пор, пока он не будет разбужен, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать до тех пор, пока он не будет разбужен, обычно посредством уведомления или прерывания, либо пока не истечёт заданный промежуток реального времени. |
final void |
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— набор символов для преобразования строки - Возвращает:
- подписчик тела ответа
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>. - См. также:
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
© 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.