- java.lang.Object
-
- java.net.http.HttpResponse.BodyHandlers
-
- Enclosing interface:
- HttpResponse < T >
public static class HttpResponse.BodyHandlersextends Object
实现各种有用处理程序的BodyHandler
的实现,例如将响应主体作为String处理,或将响应主体流式传输到文件。这些实现不检查状态代码,这意味着始终接受正文。 它们通常返回等效命名的
BodySubscriber
。 或者,可以使用自定义处理程序检查状态代码和标头,并根据需要返回相同类型的不同正文订阅者。以下是使用预定义的主体处理程序将响应正文数据流转换为常见的高级Java对象的示例:
// Receives the response body as a String HttpResponse<String> response = client .send(request, BodyHandlers.ofString()); // Receives the response body as a file HttpResponse<Path> response = client .send(request, BodyHandlers.ofFile(Paths.get("example.html"))); // Receives the response body as an InputStream HttpResponse<InputStream> response = client .send(request, BodyHandlers.ofInputStream()); // Discards the response body HttpResponse<Void> response = client .send(request, BodyHandlers.discarding());
- 从以下版本开始:
- 11
-
-
方法摘要
-
-
-
方法详细信息
-
fromSubscriber
public static HttpResponse.BodyHandler<Void> fromSubscriber(Flow.Subscriber<? super List<ByteBuffer>> subscriber)
返回一个响应体处理程序,它返回一个BodySubscriber
<Void>
是从HttpResponse.BodySubscribers.fromSubscriber(Subscriber)
获得的,给定的是subscriber
。响应正文不能通过这个或
HttpResponse
API获得,而是所有响应主体都被转发到给定的subscriber
,如果合适,它应该通过其他机制(例如数据库中的条目等)使其可用。- API Note:
- 此方法可用作
BodySubscriber
和Flow.Subscriber
之间的适配器。例如:
TextSubscriber subscriber = new TextSubscriber(); HttpResponse<Void> response = client.sendAsync(request, BodyHandlers.fromSubscriber(subscriber)).join(); System.out.println(response.statusCode());
- 参数
-
subscriber
- 订户 - 结果
- 响应体处理程序
-
fromSubscriber
public static <S extends Flow.Subscriber<? super List<ByteBuffer>>,T> HttpResponse.BodyHandler<T> fromSubscriber(S subscriber, Function<? super S,? extends T> finisher)
返回一个响应体处理程序,它返回BodySubscriber
<T>
是从HttpResponse.BodySubscribers.fromSubscriber(Subscriber, Function)
获得的,具有给定的subscriber
和finisher
函数。在调用给定订户的
onComplete
之后应用给定的finisher
函数。 使用给定订户调用finisher
函数,并返回设置为响应正文的值。- API Note:
- 该方法可用作
BodySubscriber
和Flow.Subscriber
之间的适配器。例如:
TextSubscriber subscriber = ...; // accumulates bytes and transforms them into a String HttpResponse<String> response = client.sendAsync(request, BodyHandlers.fromSubscriber(subscriber, TextSubscriber::getTextResult)).join(); String text = response.body();
- 参数类型
-
S
- 订阅者的类型 -
T
- 响应正文的类型 - 参数
-
subscriber
- 订户 -
finisher
- 订户完成后应用的功能 - 结果
- 响应体处理程序
-
fromLineSubscriber
public static HttpResponse.BodyHandler<Void> fromLineSubscriber(Flow.Subscriber<? super String> subscriber)
返回一个响应体处理程序,它返回BodySubscriber
<Void>
是从BodySubscribers.fromLineSubscriber(subscriber, s -> null, charset, null)
获得的,给定的是subscriber
。 用于解码响应主体字节的charset
是从ofString()
指定的HTTP响应头获得的,并且行以BufferedReader.readLine()
的方式分隔。响应正文不能通过这个或
HttpResponse
API获得,而是所有响应主体都被转发到给定的subscriber
,如果适当的subscriber
,它应该通过其他机制(例如数据库中的条目等)使其可用。- API Note:
- 此方法可用作
BodySubscriber
和基于文本的Flow.Subscriber
之间的适配器,该文件Flow.Subscriber
解析文本。例如:
// A PrintSubscriber that implements Flow.Subscriber<String> // and print lines received by onNext() on System.out PrintSubscriber subscriber = new PrintSubscriber(System.out); client.sendAsync(request, BodyHandlers.fromLineSubscriber(subscriber)) .thenApply(HttpResponse::statusCode) .thenAccept((status) -> { if (status != 200) { System.err.printf("ERROR: %d status received%n", status); } });
- 参数
-
subscriber
- 订户 - 结果
- 响应体处理程序
-
fromLineSubscriber
public static <S extends Flow.Subscriber<? super String>,T> HttpResponse.BodyHandler<T> fromLineSubscriber(S subscriber, Function<? super S,? extends T> finisher, String lineSeparator)
返回响应身体处理程序返回一个BodySubscriber
<T>
从获得的BodySubscribers.fromLineSubscriber(subscriber, finisher, charset, lineSeparator)
,用给定的subscriber
,finisher
功能,和在线分离器。 用于解码响应主体字节的charset
是从ofString()
指定的HTTP响应头中获得的 。在调用给定订户的
onComplete
之后应用给定的finisher
功能。 使用给定订户调用finisher
函数,并返回设置为响应正文的值。- API Note:
- 此方法可用作
BodySubscriber
和基于文本的Flow.Subscriber
之间的适配器,该文件Flow.Subscriber
解析文本。例如:
// A LineParserSubscriber that implements Flow.Subscriber<String> // and accumulates lines that match a particular pattern Pattern pattern = ...; LineParserSubscriber subscriber = new LineParserSubscriber(pattern); HttpResponse<List<String>> response = client.send(request, BodyHandlers.fromLineSubscriber(subscriber, s -> s.getMatchingLines(), "\n")); if (response.statusCode() != 200) { System.err.printf("ERROR: %d status received%n", response.statusCode()); }
- 参数类型
-
S
- 订阅者的类型 -
T
- 响应正文的类型 - 参数
-
subscriber
- 订户 -
finisher
- 订户完成后应用的功能 -
lineSeparator
- 可选的行分隔符:可以是null
,在这种情况下,行将以BufferedReader.readLine()
的方式分隔。 - 结果
- 响应体处理程序
- 异常
-
IllegalArgumentException
- 如果提供的lineSeparator
是空字符串
-
discarding
public static HttpResponse.BodyHandler<Void> discarding()
返回丢弃响应主体的响应主体处理程序。- 结果
- 响应体处理程序
-
replacing
public static <U> HttpResponse.BodyHandler<U> replacing(U value)
返回响应主体处理程序,在丢弃响应主体后返回给定的替换值。- 参数类型
-
U
- 响应正文类型 - 参数
-
value
- 作为正文返回的U值,可能是null
- 结果
- 响应体处理程序
-
ofString
public static HttpResponse.BodyHandler<String> ofString(Charset charset)
返回BodyHandler<String>
返回一个BodySubscriber
<String>
从获得BodySubscribers.ofString(Charset)
。 使用给定的字符集解码主体。- 参数
-
charset
- 用于转换正文的字符集 - 结果
- 响应体处理程序
-
ofFile
public static HttpResponse.BodyHandler<Path> ofFile(Path file, OpenOption... openOptions)
返回BodyHandler<Path>
返回一个BodySubscriber
<Path>
从获得BodySubscribers.ofFile(Path,OpenOption...)
。返回
HttpResponse
对象时,正文已完全写入文件,HttpResponse.body()
返回对其Path
的引用。创建
BodyHandler
时,将在此工厂方法中执行安全管理器权限检查。 必须注意BodyHandler
不与不受信任的代码共享。- 参数
-
file
- 存储主体的文件 -
openOptions
- 打开/创建文件时使用的任何选项 - 结果
- 响应体处理程序
- 异常
-
IllegalArgumentException
- 如果指定了一组无效的打开选项 -
SecurityException
- 如果已安装安全管理器,则会拒绝该文件的write access
。
-
ofFile
public static HttpResponse.BodyHandler<Path> ofFile(Path file)
返回BodyHandler<Path>
,返回BodySubscriber
<Path>
。相当于:
ofFile(file, CREATE, WRITE)
创建
BodyHandler
时,将在此工厂方法中执行安全管理器权限检查。 必须注意BodyHandler
不与不受信任的代码共享。- 参数
-
file
- 存储正文的文件 - 结果
- 响应体处理程序
- 异常
-
SecurityException
- 如果已安装安全管理器,则会拒绝该文件的write access
。
-
ofFileDownload
public static HttpResponse.BodyHandler<Path> ofFileDownload(Path directory, OpenOption... openOptions)
返回BodyHandler<Path>
,返回BodySubscriber
<Path
>,其中指定了下载目录,但文件名是从Content-Disposition
响应头获取的。Content-Disposition
标头必须指定附件类型,并且还必须包含文件名参数。 如果文件名指定多个路径组件,则仅将最终组件用作文件名(具有给定的目录名称)。返回
HttpResponse
对象时,正文已完全写入文件,HttpResponse.body()
返回该文件的Path
对象。 返回的Path
是提供的目录名称和服务器提供的文件名的组合。 如果目标目录不存在或无法写入,则响应将失败并显示IOException
。创建
BodyHandler
时,将在此工厂方法中执行安全管理器权限检查。 必须注意BodyHandler
不与不受信任的代码共享。- 参数
-
directory
- 存储文件的目录 -
openOptions
- 打开文件时使用的打开选项 - 结果
- 响应体处理程序
- 异常
-
IllegalArgumentException
- 如果给定路径不存在,不是目录,不可写,或者是否指定了无效的打开选项集 -
SecurityException
- 如果已安装安全管理器并且它拒绝该目录的 read access ,或者它拒绝该目录的 write access ,或者它拒绝该目录中的文件 write access 。
-
ofInputStream
public static HttpResponse.BodyHandler<InputStream> ofInputStream()
返回BodyHandler<InputStream>
返回一个BodySubscriber
<InputStream>
从获得BodySubscribers.ofInputStream
。返回
HttpResponse
对象时,响应标头将被完全读取,但主体可能尚未完全接收。HttpResponse.body()
方法返回InputStream
,从中可以读取正文。- API Note:
- 有关更多信息,请参见
HttpResponse.BodySubscribers.ofInputStream()
。 - 结果
- 响应体处理程序
-
ofLines
public static HttpResponse.BodyHandler<Stream<String>> ofLines()
返回BodyHandler<Stream<String>>
返回一个BodySubscriber
<Stream<String>>
从获得BodySubscribers.ofLines(charset)
。 用于解码响应主体字节的charset
是从ofString()
指定的HTTP响应头获得的,并且行以BufferedReader.readLine()
的方式分隔。返回
HttpResponse
对象时,可能尚未完全接收到正文。- 结果
- 响应体处理程序
-
ofByteArrayConsumer
public static HttpResponse.BodyHandler<Void> ofByteArrayConsumer(Consumer<Optional<byte[]>> consumer)
返回BodyHandler<Void>
返回一个BodySubscriber
<Void>
从获得BodySubscribers.ofByteArrayConsumer(Consumer)
。返回
HttpResponse
对象时,正文已完全写入使用者。- API Note:
- 此处理程序返回的订户不受流量控制。 因此,提供的消费者必须能够及时处理任何数量的数据。
- 参数
-
consumer
- 接受响应机构的消费者 - 结果
- 响应体处理程序
-
ofByteArray
public static HttpResponse.BodyHandler<byte[]> ofByteArray()
返回BodyHandler<byte[]>
,返回从BodySubscribers.ofByteArray()
获得的BodySubscriber
<byte[]
>。返回
HttpResponse
对象时,正文已完全写入字节数组。- 结果
- 响应体处理程序
-
ofString
public static HttpResponse.BodyHandler<String> ofString()
返回BodyHandler<String>
返回一个BodySubscriber
<String>
从获得BodySubscribers.ofString(Charset)
。 使用Content-Type
响应头中指定的字符集对主体进行解码。 如果没有这样的标题,或者不支持字符集,则使用UTF_8
。返回
HttpResponse
对象时,正文已完全写入字符串。- 结果
- 响应体处理程序
-
ofPublisher
public static HttpResponse.BodyHandler<Flow.Publisher<List<ByteBuffer>>> ofPublisher()
返回BodyHandler<Publisher<List<ByteBuffer>>>
,其创建BodySubscriber
<Publisher<List<ByteBuffer>>>
获自BodySubscribers.ofPublisher()
。返回
HttpResponse
对象时,响应标头将被完全读取,但主体可能尚未完全接收。HttpResponse.body()
方法返回Publisher
,从中可以获得正文响应字节。 发布者可以而且必须只订阅一次。- >
- API Note:
- 有关更多信息,请参见
HttpResponse.BodySubscribers.ofPublisher()
。 - 结果
- 响应体处理程序
-
buffering
public static <T> HttpResponse.BodyHandler<T> buffering(HttpResponse.BodyHandler<T> downstreamHandler, int bufferSize)
返回BodyHandler
,在调用时返回buffering BodySubscriber ,该数据在将数据传递给下游订阅者之前缓冲数据。 通过使用从给定下游处理程序和bufferSize
参数获得的订户调用BodySubscribers.buffering
来创建这些BodySubscriber
实例。- 参数类型
-
T
- 响应正文类型 - 参数
-
downstreamHandler
- 下游处理程序 -
bufferSize
- 传递给BodySubscribers.buffering
的缓冲区大小参数 - 结果
- 身体处理者
- 异常
-
IllegalArgumentException
- ifbufferSize <= 0
-
-