Класс 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));
- С:
- 11
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static <T> HttpResponse.BodySubscriber<T> |
buffering |
Возвращает BodySubscriber, который буферизует данные перед передачей их в заданного подписчика-последователя. |
static HttpResponse.BodySubscriber<Void> |
discarding() |
Возвращает подписчика ответа, который отбрасывает тело ответа. |
static HttpResponse.BodySubscriber<Void> |
fromLineSubscriber |
Возвращает подписчика тела, который пересылает все тело ответа в заданный Flow.Subscriber, по строкам. |
static <S extends Flow.Subscriber<? super String>, |
fromLineSubscriber |
Возвращает подписчика тела, который пересылает все тело ответа в заданный Flow.Subscriber, по строкам. |
static HttpResponse.BodySubscriber<Void> |
fromSubscriber |
Возвращает подписчика тела, который пересылает всё тело ответа в заданный Flow.Subscriber. |
static <S extends Flow.Subscriber<? super List<ByteBuffer>>, |
fromSubscriber |
Возвращает подписчика тела, который пересылает всё тело ответа в заданный Flow.Subscriber. |
static <T, |
mapping |
Возвращает BodySubscriber, значение тела ответа которого является результатом применения заданной функции к объекту тела ответа заданного upstream BodySubscriber. |
static HttpResponse.BodySubscriber<byte[]> |
ofByteArray() |
Возвращает BodySubscriber, который сохраняет тело ответа как массив байтов. |
static HttpResponse.BodySubscriber<Void> |
ofByteArrayConsumer |
Возвращает BodySubscriber, который предоставляет данные входящего тела заданному Consumer of Optional<byte[]>. |
static HttpResponse.BodySubscriber<Path> |
ofFile |
Возвращает BodySubscriber, который сохраняет тело ответа в файл, открытый с заданным именем. |
static HttpResponse.BodySubscriber<Path> |
ofFile |
Возвращает BodySubscriber, который сохраняет тело ответа в файл, открытый с заданными параметрами и именем. |
static HttpResponse.BodySubscriber<InputStream> |
ofInputStream() |
Возвращает BodySubscriber, который передает тело ответа как InputStream. |
static HttpResponse.BodySubscriber<Stream<String>> |
ofLines |
Возвращает BodySubscriber, который передает тело ответа как Stream<String>, где каждая строка в потоке соответствует строке, определенной BufferedReader.lines(). |
static HttpResponse.BodySubscriber<Flow.Publisher<List<ByteBuffer>>> |
ofPublisher() |
Возвращает подписчика ответа, который публикует тело ответа через Publisher<List<ByteBuffer>>. |
static HttpResponse.BodySubscriber<String> |
ofString |
Возвращает подписчика тела, который сохраняет тело ответа как
String, преобразованное с помощью заданного Charset. |
static <U> HttpResponse.BodySubscriber<U> |
replacing |
Возвращает подписчика ответа, который отбрасывает тело ответа. |
Подробное описание методов
fromSubscriber
public static HttpResponse.BodySubscriber<Void> fromSubscriber(Flow.Subscriber<? super List<ByteBuffer>> subscriber)
Flow.Subscriber. Этап завершения (completion stage) возвращаемого подписчика на тело завершается после вызова одного из заданных подписчиков 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. Этап завершения (completion stage) возвращаемого подписчика на тело завершается после вызова одного из заданных подписчиков 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 по строкам. Этап завершения (completion stage) возвращаемого подписчика на тело завершается после вызова одного из заданных подписчиков 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 по строкам. Этап завершения (completion stage) возвращаемого подписчика на тело завершается после вызова одного из заданных подписчиков 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)
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 с этим подписчиком доступен после полного чтения ответа.
В случае использования стандартного поставщика файловой системы, проверки разрешений менеджера безопасности производятся в этом методе фабрики, когда BodySubscriber создаётся. В противном случае, проверки разрешений могут быть выполнены асинхронно в контексте вызывающего кода при доступе к файлу. Следует позаботиться о том, чтобы BodySubscriber не был доступен небезопасным участкам кода.
- Параметры:
-
file- файл для сохранения тела -
openOptions- список параметров открытия файла - Возвращает:
- подписчик на тело ответа
- Исключения:
-
IllegalArgumentException- если указан недопустимый набор параметров открытия -
SecurityException- в случае использования стандартного поставщика файловой системы и установленного менеджера безопасности, вызываетсяcheckWriteдля проверки доступа на запись к указанному файлу
ofFile
public static HttpResponse.BodySubscriber<Path> ofFile(Path file)
BodySubscriber, который сохраняет тело ответа в файл с заданным именем. Эквивалентно: ofFile(file, CREATE, WRITE)
В случае использования стандартного поставщика файловой системы, проверки разрешений менеджера безопасности производятся в этом методе фабрики, когда BodySubscriber создаётся. В противном случае, проверки разрешений могут быть выполнены асинхронно в контексте вызывающего кода при доступе к файлу. Следует позаботиться о том, чтобы BodySubscriber не был доступен небезопасным участкам кода.
- Параметры:
-
file- файл для сохранения тела - Возвращает:
- подписчик на тело ответа
- Исключения:
-
SecurityException- в случае использования стандартного поставщика файловой системы и установленного менеджера безопасности, вызываетсяcheckWriteдля проверки доступа на запись к указанному файлу
ofByteArrayConsumer
public static HttpResponse.BodySubscriber<Void> ofByteArrayConsumer(Consumer<Optional<byte[]>> consumer)
BodySubscriber, который предоставляет входящие данные тела заданному обработчику Optional<byte[]>. Каждый вызов Consumer.accept() будет содержать непустой Optional, за исключением последнего вызова после чтения всех данных тела, когда
Optional будет пустым. HttpResponse с этим подписчиком доступен после полного чтения ответа.
- Примечание API:
- Этот подписчик не контролирует поток данных. Поэтому, предоставленный обработчик должен быть способен обрабатывать доставленный объём данных в своём темпе.
- Параметры:
-
consumer- обработчик массивов байтов - Возвращает:
- BodySubscriber
ofInputStream
public static HttpResponse.BodySubscriber<InputStream> ofInputStream()
BodySubscriber, который получает тело ответа как поток InputStream. Объект HttpResponse, использующий этого подписчика, доступен сразу после чтения заголовков ответа, без необходимости ожидания обработки всего тела. Тело ответа можно прочитать напрямую из потока InputStream.
- API Note:
- Для обеспечения правильного освобождения всех ресурсов, связанных с соответствующим обменом, вызывающая сторона должна либо прочитать все байты до достижения конца потока, либо вызвать
InputStream.close(), если это невозможно или нежелательно. Вызовcloseдо исчерпания потока может привести к закрытию базового HTTP-соединения и предотвратить его повторное использование для последующих операций. - Возвращает:
- подписчик тела, который получает тело ответа как
InputStream.
ofLines
public static HttpResponse.BodySubscriber<Stream<String>> ofLines(Charset charset)
BodySubscriber, который получает тело ответа как поток Stream<String>, где каждая строка в потоке соответствует строке, как определено в BufferedReader.lines(). Объект HttpResponse, использующий этого подписчика, доступен сразу после чтения заголовков ответа, без необходимости ожидания обработки всего тела. Тело ответа можно прочитать напрямую из потока Stream.
- API Note:
- Для обеспечения правильного освобождения всех ресурсов, связанных с соответствующим обменом, вызывающая сторона должна либо прочитать все строки до исчерпания потока, либо вызвать
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 Note:
- Для обеспечения правильного освобождения всех ресурсов, связанных с соответствующим обменом, вызывающая сторона должна гарантировать, что предоставленный издатель подписан один раз, и либо запрашивает все байты до вызова
onCompleteилиonError, либо отменяет предоставленную подписку, если это невозможно или нежелательно. Обратите внимание, что в зависимости от фактически используемого HTTP-протокола версии для обмена, отмена подписки вместо исчерпания потока может привести к закрытию базового HTTP-соединения и предотвратить его повторное использование для последующих операций. - Возвращает:
BodySubscriberкоторый публикует тело ответа черезPublisher<List<ByteBuffer>>.
replacing
public static <U> HttpResponse.BodySubscriber<U> replacing(U value)
HttpResponse.body().- Параметры типа:
-
U- тип тела ответа - Параметры:
-
value- значение, которое будет возвращено из HttpResponse.body(), может бытьnull - Возвращает:
BodySubscriber
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- функция преобразования - Возвращает:
- подписчик тела преобразования
© 1993, 2021, 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/17/docs/api/java.net.http/java/net/http/HttpResponse.BodySubscribers.html