Module java.net.http
Package java.net.http

Interface HttpResponse.BodyHandler<T>

类型参数:
T - 响应体类型
封闭接口:
HttpResponse<T>
函数式接口:
这是一个函数式接口,因此可以用作lambda表达式或方法引用的赋值目标。

@FunctionalInterface public static interface HttpResponse.BodyHandler<T>
响应体处理程序。类BodyHandlers提供了许多常见的响应体处理程序的实现。

BodyHandler接口允许在实际接收响应体之前检查响应代码和标头,并负责创建响应BodySubscriberBodySubscriber消耗实际的响应体字节,并通常将其转换为更高级别的Java类型。

BodyHandler是一个接受ResponseInfo对象的函数;并返回一个BodySubscriber。当响应状态代码和标头可用时,但在接收响应体字节之前,将调用BodyHandler

以下示例使用了一个预定义的响应体处理程序,始终以相同的方式处理响应体(将响应体流式传输到文件中)。

  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://www.foo.com/"))
      .build();

client.sendAsync(request, BodyHandlers.ofFile(Paths.get("/tmp/f")))
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println);
请注意,即使预定义的处理程序不检查响应代码,当返回时,仍然可以从HttpResponse中检索响应代码和标头。

在第二个示例中,该函数根据状态代码返回不同的订阅者。

  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://www.foo.com/"))
      .build();
BodyHandler<Path> bodyHandler = (rspInfo) -> rspInfo.statusCode() == 200
                    ? BodySubscribers.ofFile(Paths.get("/tmp/f"))
                    : BodySubscribers.replacing(Paths.get("/NULL"));
client.sendAsync(request, bodyHandler)
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println);
自 JDK 版本:
11
参见: