-
- Type Parameters:
T- the response body type
- Enclosing class:
- HttpResponse<T>
- Functional Interface:
- This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
@FunctionalInterface public static interface HttpResponse.BodyHandler<T>
A handler for response bodies.
Incubating Feature. Will be removed in a future release.This is a function that takes two parameters: the response status code, and the response headers, and which returns a HttpResponse.BodySubscriber. The function is always called just before the response body is read. Its implementation may examine the status code or headers and must decide, whether to accept the response body or discard it, and if accepting it, exactly how to handle it.
Some pre-defined implementations which do not utilize the status code or headers (meaning the body is always accepted) are defined:
asByteArray()asByteArrayConsumer(Consumer)asString(Charset)asFile(Path,OpenOption...)asFileDownload(Path,OpenOption...)asInputStream()discard(Object)buffering(BodyHandler,int)
These implementations return the equivalent
HttpResponse.BodySubscriber. Alternatively, the handler can be used to examine the status code or headers and return different body subscribers as appropriate.Examples of handler usage
The first example uses one of the predefined handler functions which ignores the response headers and status, and always process the response body in the same way.
Note, that even though these pre-defined handlers ignore the status code and headers, this information is still accessible from theHttpResponse<Path> resp = HttpRequest .create(URI.create("http://www.foo.com")) .GET() .response(BodyHandler.asFile(Paths.get("/tmp/f")));HttpResponsewhen it is returned.In the second example, the function returns a different subscriber depending on the status code.
HttpResponse<Path> resp1 = HttpRequest .create(URI.create("http://www.foo.com")) .GET() .response( (status, headers) -> status == 200 ? BodySubscriber.asFile(Paths.get("/tmp/f")) : BodySubscriber.discard(Paths.get("/NULL")));
-
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Modifier and Type Method Description HttpResponse.BodySubscriber<T>apply(int statusCode, HttpHeaders responseHeaders)Returns aBodySubscriberconsidering the given response status code and headers.static HttpResponse.BodyHandler<byte[]>asByteArray()Returns aBodyHandler<byte[]>that returns aBodySubscriber<byte[]> obtained fromBodySubscriber.asByteArray().static HttpResponse.BodyHandler<Void>asByteArrayConsumer(Consumer<Optional<byte[]>> consumer)Returns aBodyHandler<Void>that returns aBodySubscriber<Void>obtained fromBodySubscriber.asByteArrayConsumer(Consumer).static HttpResponse.BodyHandler<Path>asFile(Path file)Returns aBodyHandler<Path>that returns aBodySubscriber<Path>obtained fromBodySubscriber.asFile(Path).static HttpResponse.BodyHandler<Path>asFile(Path file, OpenOption... openOptions)Returns aBodyHandler<Path>that returns aBodySubscriber<Path>obtained fromBodySubscriber.asFile(Path,OpenOption...).static HttpResponse.BodyHandler<Path>asFileDownload(Path directory, OpenOption... openOptions)Returns aBodyHandler<Path>that returns aBodySubscriber<Path> where the download directory is specified, but the filename is obtained from theContent-Dispositionresponse header.static HttpResponse.BodyHandler<InputStream>asInputStream()Returns aBodyHandler<InputStream>that returns aBodySubscriber<InputStream>obtained fromBodySubscriber.asInputStream.static HttpResponse.BodyHandler<String>asString()Returns aBodyHandler<String>that returns aBodySubscriber<String>obtained fromBodySubscriber.asString(Charset).static HttpResponse.BodyHandler<String>asString(Charset charset)Returns aBodyHandler<String>that returns aBodySubscriber<String>obtained fromBodySubscriber.asString(Charset).static <T> HttpResponse.BodyHandler<T>buffering(HttpResponse.BodyHandler<T> downstreamHandler, int bufferSize)Returns aBodyHandlerwhich, when invoked, returns a buffering BodySubscriber that buffers data before delivering it to the downstream subscriber.static <U> HttpResponse.BodyHandler<U>discard(U value)Returns a response body handler which discards the response body and uses the given value as a replacement for it.static HttpResponse.BodyHandler<Void>fromSubscriber(Flow.Subscriber<? super List<ByteBuffer>> subscriber)Returns a response body handler that returns aBodySubscriber<Void>obtained from HttpResponse.BodySubscriber.fromSubscriber(Subscriber), with the givensubscriber.static <S extends Flow.Subscriber<? super List<ByteBuffer>>,T>
HttpResponse.BodyHandler<T>fromSubscriber(S subscriber, Function<S,T> finisher)Returns a response body handler that returns aBodySubscriber<T>obtained fromHttpResponse.BodySubscriber.fromSubscriber(Subscriber, Function), with the givensubscriberandfinisherfunction.
-
-
-
Method Detail
-
apply
HttpResponse.BodySubscriber<T> apply(int statusCode, HttpHeaders responseHeaders)
Returns aBodySubscriberconsidering the given response status code and headers. This method is always called before the body is read and its implementation can decide to keep the body and store it somewhere, or else discard it by returning theBodySubscriberreturned fromdiscard.- Parameters:
statusCode- the HTTP status code receivedresponseHeaders- the response headers received- Returns:
- a body subscriber
-
fromSubscriber
static HttpResponse.BodyHandler<Void> fromSubscriber(Flow.Subscriber<? super List<ByteBuffer>> subscriber)
Returns a response body handler that returns aBodySubscriber<Void>obtained from HttpResponse.BodySubscriber.fromSubscriber(Subscriber), with the givensubscriber.The response body is not available through this, or the
HttpResponseAPI, but instead all response body is forwarded to the givensubscriber, which should make it available, if appropriate, through some other mechanism, e.g. an entry in a database, etc.- API Note:
- This method can be used as an adapter between
BodySubscriberandFlow.Subscriber.For example:
TextSubscriber subscriber = new TextSubscriber(); HttpResponse<Void> response = client.sendAsync(request, BodyHandler.fromSubscriber(subscriber)).join(); System.out.println(response.statusCode()); - Parameters:
subscriber- the subscriber- Returns:
- a response body handler
-
fromSubscriber
static <S extends Flow.Subscriber<? super List<ByteBuffer>>,T> HttpResponse.BodyHandler<T> fromSubscriber(S subscriber, Function<S,T> finisher)
Returns a response body handler that returns aBodySubscriber<T>obtained fromHttpResponse.BodySubscriber.fromSubscriber(Subscriber, Function), with the givensubscriberandfinisherfunction.The given
finisherfunction is applied after the given subscriber'sonCompletehas been invoked. Thefinisherfunction is invoked with the given subscriber, and returns a value that is set as the response's body.- API Note:
- This method can be used as an adapter between
BodySubscriberandFlow.Subscriber.For example:
TextSubscriber subscriber = ...; // accumulates bytes and transforms them into a String HttpResponse<String> response = client.sendAsync(request, BodyHandler.fromSubscriber(subscriber, TextSubscriber::getTextResult)).join(); String text = response.body(); - Type Parameters:
S- the type of the SubscriberT- the type of the response body- Parameters:
subscriber- the subscriberfinisher- a function to be applied after the subscriber has completed- Returns:
- a response body handler
-
discard
static <U> HttpResponse.BodyHandler<U> discard(U value)
Returns a response body handler which discards the response body and uses the given value as a replacement for it.- Type Parameters:
U- the response body type- Parameters:
value- the value of U to return as the body, may benull- Returns:
- a response body handler
-
asString
static HttpResponse.BodyHandler<String> asString(Charset charset)
Returns aBodyHandler<String>that returns aBodySubscriber<String>obtained fromBodySubscriber.asString(Charset). The body is decoded using the given character set.- Parameters:
charset- the character set to convert the body with- Returns:
- a response body handler
-
asFile
static HttpResponse.BodyHandler<Path> asFile(Path file, OpenOption... openOptions)
Returns aBodyHandler<Path>that returns aBodySubscriber<Path>obtained fromBodySubscriber.asFile(Path,OpenOption...).When the
HttpResponseobject is returned, the body has been completely written to the file, andHttpResponse.body()returns a reference to itsPath.- Parameters:
file- the filename to store the body inopenOptions- any options to use when opening/creating the file- Returns:
- a response body handler
- Throws:
SecurityException- If a security manager has been installed and it denieswrite accessto the file. ThecheckDeletemethod is invoked to check delete access if the file is opened with theDELETE_ON_CLOSEoption.
-
asFile
static HttpResponse.BodyHandler<Path> asFile(Path file)
Returns aBodyHandler<Path>that returns aBodySubscriber<Path>obtained fromBodySubscriber.asFile(Path).When the
HttpResponseobject is returned, the body has been completely written to the file, andHttpResponse.body()returns a reference to itsPath.- Parameters:
file- the file to store the body in- Returns:
- a response body handler
- Throws:
SecurityException- if a security manager has been installed and it denieswrite accessto the file
-
asFileDownload
static HttpResponse.BodyHandler<Path> asFileDownload(Path directory, OpenOption... openOptions)
Returns aBodyHandler<Path>that returns aBodySubscriber<Path> where the download directory is specified, but the filename is obtained from theContent-Dispositionresponse header. TheContent-Dispositionheader must specify the attachment type and must also contain a filename parameter. If the filename specifies multiple path components only the final component is used as the filename (with the given directory name).When the
HttpResponseobject is returned, the body has been completely written to the file andHttpResponse.body()returns aPathobject for the file. The returnedPathis the combination of the supplied directory name and the file name supplied by the server. If the destination directory does not exist or cannot be written to, then the response will fail with anIOException.- Parameters:
directory- the directory to store the file inopenOptions- open options- Returns:
- a response body handler
- Throws:
SecurityException- If a security manager has been installed and it denieswrite accessto the file. ThecheckDeletemethod is invoked to check delete access if the file is opened with theDELETE_ON_CLOSEoption.
-
asInputStream
static HttpResponse.BodyHandler<InputStream> asInputStream()
Returns aBodyHandler<InputStream>that returns aBodySubscriber<InputStream>obtained fromBodySubscriber.asInputStream.When the
HttpResponseobject is returned, the response headers will have been completely read, but the body may not have been fully received yet. TheHttpResponse.body()method returns anInputStreamfrom which the body can be read as it is received.- API Note:
- See
HttpResponse.BodySubscriber.asInputStream()for more information. - Returns:
- a response body handler
-
asByteArrayConsumer
static HttpResponse.BodyHandler<Void> asByteArrayConsumer(Consumer<Optional<byte[]>> consumer)
Returns aBodyHandler<Void>that returns aBodySubscriber<Void>obtained fromBodySubscriber.asByteArrayConsumer(Consumer).When the
HttpResponseobject is returned, the body has been completely written to the consumer.- Parameters:
consumer- a Consumer to accept the response body- Returns:
- a response body handler
-
asByteArray
static HttpResponse.BodyHandler<byte[]> asByteArray()
Returns aBodyHandler<byte[]>that returns aBodySubscriber<byte[]> obtained fromBodySubscriber.asByteArray().When the
HttpResponseobject is returned, the body has been completely written to the byte array.- Returns:
- a response body handler
-
asString
static HttpResponse.BodyHandler<String> asString()
Returns aBodyHandler<String>that returns aBodySubscriber<String>obtained fromBodySubscriber.asString(Charset). The body is decoded using the character set specified in theContent-encodingresponse header. If there is no such header, or the character set is not supported, thenUTF_8is used.When the
HttpResponseobject is returned, the body has been completely written to the string.- Returns:
- a response body handler
-
buffering
static <T> HttpResponse.BodyHandler<T> buffering(HttpResponse.BodyHandler<T> downstreamHandler, int bufferSize)
Returns aBodyHandlerwhich, when invoked, returns a buffering BodySubscriber that buffers data before delivering it to the downstream subscriber. TheseBodySubscriberinstances are created by calling BodySubscriber.buffering with a subscriber obtained from the given downstream handler and thebufferSizeparameter.- Parameters:
downstreamHandler- the downstream handlerbufferSize- the buffer size parameter passed to BodySubscriber.buffering- Returns:
- a body handler
- Throws:
IllegalArgumentException- ifbufferSize <= 0
-
-