模块  java.net.http
软件包  java.net.http

Class HttpResponse.BodyHandlers

  • Enclosing interface:
    HttpResponse < T >

    public static class HttpResponse.BodyHandlers
    extends 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:
        此方法可用作BodySubscriberFlow.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)获得的,具有给定的subscriberfinisher函数。

        在调用给定订户的onComplete之后应用给定的finisher函数。 使用给定订户调用finisher函数,并返回设置为响应正文的值。

        API Note:
        该方法可用作BodySubscriberFlow.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) ,用给定的subscriberfinisher功能,和在线分离器。 用于解码响应主体字节的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
        结果
        响应体处理程序
      • 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
      • ofByteArrayConsumer

        public static HttpResponse.BodyHandler<Void> ofByteArrayConsumer​(Consumer<Optional<byte[]>> consumer)
        返回BodyHandler<Void>返回一个BodySubscriber <Void>从获得BodySubscribers.ofByteArrayConsumer(Consumer)

        返回HttpResponse对象时,正文已完全写入使用者。

        API Note:
        此处理程序返回的订户不受流量控制。 因此,提供的消费者必须能够及时处理任何数量的数据。
        参数
        consumer - 接受响应机构的消费者
        结果
        响应体处理程序
      • ofString

        public static HttpResponse.BodyHandler<String> ofString()
        返回BodyHandler<String>返回一个BodySubscriber <String>从获得BodySubscribers.ofString(Charset) 使用Content-Type响应头中指定的字符集对主体进行解码。 如果没有这样的标题,或者不支持字符集,则使用UTF_8

        返回HttpResponse对象时,正文已完全写入字符串。

        结果
        响应体处理程序