Класс 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 |
buffering |
Возвращает BodySubscriber, который буферизует данные перед передачей их заданному подписчику вниз по потоку. |
static HttpResponse.BodySubscriber |
discarding() |
Возвращает подписчика ответа, который игнорирует тело ответа. |
static HttpResponse.BodySubscriber |
fromLineSubscriber |
Возвращает подписчика тела, который пересылает всё тело ответа в предоставленный Flow.Subscriber, построчно. |
static <S extends Flow.Subscriber<? super String>, |
fromLineSubscriber |
Возвращает подписчика тела, который пересылает всё тело ответа в предоставленный Flow.Subscriber, построчно. |
static HttpResponse.BodySubscriber |
fromSubscriber |
Возвращает подписчика тела, который пересылает всё тело ответа в предоставленный Flow.Subscriber. |
static <S extends Flow.Subscriber<? super List<ByteBuffer>>, |
fromSubscriber |
Возвращает подписчика тела, который пересылает всё тело ответа в предоставленный Flow.Subscriber. |
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 |
Возвращает подписчика ответа, который игнорирует тело ответа. |
Подробное описание методов
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 с этим подписчиком доступен после чтения всего ответа.
В случае использования поставщика файловой системы по умолчанию, проверки разрешений менеджера безопасности выполняются в этом методе, когда 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-соединения и предотвратить его повторное использование для последующих операций. - Implementation Note:
- Метод
readобъектаInputStream, возвращаемого по умолчанию этим методом, броситIOExceptionс установленным статусом прерывания потока, если поток прерван во время блокировки на чтение. В этом случае запрос также будет отменён, иInputStreamбудет закрыт. - Returns:
- подписчик тела, который потоково считывает тело ответа в виде
InputStream.
ofLines
public static HttpResponse.BodySubscriber<Stream<String>> ofLines(Charset charset)
BodySubscriber, который потоково считывает тело ответа в виде Stream<String>, где каждая строка в потоке соответствует строке, определённой в BufferedReader.lines(). HttpResponse, использующий этого подписчика, доступен сразу после чтения заголовков ответа, без ожидания обработки всего тела. Тело ответа можно затем прочитать напрямую из Stream.
- API Note:
- Для надлежащего освобождения всех ресурсов, связанных с соответствующим обменом, вызывающая сторона должна либо прочитать все строки до исчерпания потока, либо вызвать
BaseStream.close(), если это невозможно или нежелательно. Вызовcloseперед исчерпанием потока может привести к закрытию базового HTTP-соединения и предотвратить его повторное использование для последующих операций. - Parameters:
-
charset- кодировка символов, используемая при преобразовании байтов в символы - Returns:
- подписчик тела, который потоково считывает тело ответа в виде
Stream<String>. - See Also:
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-соединения и предотвратить его повторное использование для последующих операций. - Returns:
BodySubscriber, который публикует тело ответа черезPublisher<List<ByteBuffer>>.
replacing
public static <U> HttpResponse.BodySubscriber<U> replacing(U value)
HttpResponse.body().- Type Parameters:
-
U- тип тела ответа - Parameters:
-
value- значение, возвращаемое из HttpResponse.body(), может бытьnull - Returns:
BodySubscriber
discarding
public static HttpResponse.BodySubscriber<Void> discarding()
- Returns:
- подписчик тела ответа
buffering
public static <T> HttpResponse.BodySubscriber<T> buffering(HttpResponse.BodySubscriber<T> downstream, int bufferSize)
BodySubscriber, который буферизует данные перед передачей их заданному подписчику вниз по потоку. Подписчик гарантирует доставку bufferSize байт данных при каждом вызове метода onNext подписчика вниз по потоку, за исключением последнего вызова, непосредственно перед вызовом onComplete. Последний вызов onNext может содержать меньше, чем bufferSize байт. Возвращаемый подписчик делегирует свой метод getBody() подписчику вниз по потоку.
- Type Parameters:
-
T- тип тела ответа - Parameters:
-
downstream- подписчик вниз по потоку -
bufferSize- размер буфера - Returns:
- подписчик буферизации тела
- Throws:
-
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. Функция отображения выполняется с помощью исполнителя клиента executor и поэтому может быть использована для отображения любого типа тела ответа, включая блокирующие 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;
} - Type Parameters:
-
T- тип тела потока вверх по потоку -
U- тип возвращаемого подписчика тела - Parameters:
-
upstream- подписчик тела для отображения -
mapper- функция отображения - Returns:
- подписчик отображения тела
© 1993, 2023, 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/21/docs/api/java.net.http/java/net/http/HttpResponse.BodySubscribers.html