HttpResponse.BodyHandler (Java SE 11 & JDK 11 [ad-hoc build]) (original) (raw)

A handler for response bodies. The class BodyHandlers provides implementations of many common body handlers.

The BodyHandler interface allows inspection of the response code and headers, before the actual response body is received, and is responsible for creating the response BodySubscriber. The BodySubscriber consumes the actual response body bytes and, typically, converts them into a higher-level Java type.

A BodyHandler is a function that takes two parameters: the response status code and the response headers; and which returns aBodySubscriber. The BodyHandler is invoked when the response status code and headers are available, but before the response body bytes are received.

The following example uses one of the predefined body handlers that always process the response body in the same way ( streams the response body to a file ).

  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); 

Note, that even though the pre-defined handlers do not examine the response code, the response code and headers are always retrievable from the HttpResponse, when it is returned.

In the second example, the function returns a different subscriber depending on the status code.

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