AnHttpClient can be used to sendrequests and retrieve theirresponses. An HttpClient is created through abuilder. ThenewBuilder method returns a builder that creates instances of the defaultHttpClient implementation. The builder can be used to configure per-client state, like: the preferred protocol version ( HTTP/1.1 or HTTP/2 ), whether to follow redirects, a proxy, an authenticator, etc. Once built, anHttpClient is immutable, and can be used to send multiple requests.
AnHttpClient provides configuration information, and resource sharing, for all requests sent through it.
ABodyHandler must be supplied for eachHttpRequest sent. TheBodyHandler determines how to handle the response body, if any. Once anHttpResponse is received, the headers, response code, and body (typically) are available. Whether the response body bytes have been read or not depends on the type,T, of the response body.
Requests can be sent either synchronously or asynchronously:
send(HttpRequest, BodyHandler)blocks until the request has been sent and the response has been received.sendAsync(HttpRequest, BodyHandler)sends the request and receives the response asynchronously. ThesendAsyncmethod returns immediately with aCompletableFuture<HttpResponse>. TheCompletableFuturecompletes when the response becomes available. The returnedCompletableFuturecan be combined in different ways to declare dependencies among several asynchronous tasks.
Synchronous Example
HttpClient client = HttpClient.newBuilder() .version(Version.HTTP_1_1) .followRedirects(Redirect.NORMAL) .connectTimeout(Duration.ofSeconds(20)) .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80))) .authenticator(Authenticator.getDefault()) .build(); HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); System.out.println(response.statusCode()); System.out.println(response.body());Asynchronous Example
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://foo.com/")) .timeout(Duration.ofMinutes(2)) .header("Content-Type", "application/json") .POST(BodyPublishers.ofFile(Paths.get("file.json"))) .build(); client.sendAsync(request, BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println); If a security manager is present then security checks are performed by the HTTP Client's sending methods. An appropriateURLPermission is required to access the destination server, and proxy server if one has been configured. The form of theURLPermission required to access a proxy has amethod parameter of"CONNECT" (for all kinds of proxying) and aURL string of the form"socket://host:port" where host and port specify the proxy's address.
- Implementation Note:
- If an explicitexecutor has not been set for an
HttpClient, and a security manager has been installed, then the default executor will execute asynchronous and dependent tasks in a context that is granted no permissions. Customrequest body publishers,response body handlers,response body subscribers, andWebSocket Listeners, if executing operations that require privileges, should do so within an appropriateprivileged context. - Since:
- 11
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interfaceA builder ofHTTP Clients.static enumDefines the automatic redirection policy.static enumThe HTTP protocol version.Constructor Summary
ConstructorsMethod Summary
Modifier and TypeMethodDescriptionabstractOptional<Authenticator>Returns anOptionalcontaining theAuthenticatorset on this client.Returns anOptionalcontaining theconnect timeout duration for this client.abstractOptional<CookieHandler>Returns anOptionalcontaining this client'sCookieHandler.executor()Returns anOptionalcontaining this client'sExecutor.abstractHttpClient.RedirectReturns the follow redirects policy for this client.staticHttpClient.BuilderCreates a newHttpClientbuilder.staticHttpClientReturns a newHttpClientwith default settings.Creates a newWebSocketbuilder (optional operation).abstractOptional<ProxySelector>proxy()Returns anOptionalcontaining theProxySelectorsupplied to this client.abstract <T> HttpResponse<T>send(HttpRequest request,HttpResponse.BodyHandler<T> responseBodyHandler) Sends the given request using this client, blocking if necessary to get the response.abstract <T> CompletableFuture<HttpResponse<T>>sendAsync(HttpRequest request,HttpResponse.BodyHandler<T> responseBodyHandler) Sends the given request asynchronously using this client with the given response body handler.abstract <T> CompletableFuture<HttpResponse<T>>sendAsync(HttpRequest request,HttpResponse.BodyHandler<T> responseBodyHandler,HttpResponse.PushPromiseHandler<T> pushPromiseHandler) Sends the given request asynchronously using this client with the given response body handler and push promise handler.abstractSSLContextReturns this client'sSSLContext.abstractSSLParametersReturns a copy of this client'sSSLParameters.abstractHttpClient.Versionversion()Returns the preferred HTTP protocol version for this client.
Constructor Details
HttpClient
protected HttpClient()Creates an HttpClient.
Method Details
newHttpClient
Returns a newHttpClientwith default settings.Equivalent to
newBuilder().build().The default settings include: the "GET" request method, a preference ofHTTP/2, a redirection policy ofNEVER, thedefault proxy selector, and thedefault SSL context.
- Implementation Note:
- The system-wide default values are retrieved at the time the
HttpClientinstance is constructed. Changing the system-wide values after anHttpClientinstance has been built, for instance, by callingProxySelector.setDefault(ProxySelector)orSSLContext.setDefault(SSLContext), has no effect on already built instances. - Returns:
- a new HttpClient
- Throws:
UncheckedIOException- if necessary underlying IO resources required tobuild a new HttpClient cannot be allocated.
newBuilder
Creates a newHttpClientbuilder.Builders returned by this method create instances of the default
HttpClientimplementation.- Returns:
- an
HttpClient.Builder
cookieHandler
Returns anOptionalcontaining this client'sCookieHandler. If noCookieHandlerwas set in this client's builder, then theOptionalis empty.- Returns:
- an
Optionalcontaining this client'sCookieHandler
connectTimeout
Returns anOptionalcontaining theconnect timeout duration for this client. If theconnect timeout duration was not set in the client's builder, then theOptionalis empty.- Returns:
- an
Optionalcontaining this client's connect timeout duration
followRedirects
Returns the follow redirects policy for this client. The default value for client's built by builders that do not specify a redirect policy isNEVER.- Returns:
- this client's follow redirects setting
proxy
Returns anOptionalcontaining theProxySelectorsupplied to this client. If no proxy selector was set in this client's builder, then theOptionalis empty.Even though this method may return an empty optional, the
HttpClientmay still have a non-exposeddefault proxy selector that is used for sending HTTP requests.- Returns:
- an
Optionalcontaining the proxy selector supplied to this client.
sslContext
Returns this client'sSSLContext.If no
SSLContextwas set in this client's builder, then thedefault context is returned.- Returns:
- this client's SSLContext
sslParameters
Returns a copy of this client'sSSLParameters.If no
SSLParameterswere set in the client's builder, then an implementation specific default set of parameters, that the client will use, is returned.- Returns:
- this client's
SSLParameters
authenticator
Returns anOptionalcontaining theAuthenticatorset on this client. If noAuthenticatorwas set in the client's builder, then theOptionalis empty.- Returns:
- an
Optionalcontaining this client'sAuthenticator
version
Returns the preferred HTTP protocol version for this client. The default value isHttpClient.Version.HTTP_2- Implementation Note:
- Constraints may also affect the selection of protocol version. For example, if HTTP/2 is requested through a proxy, and if the implementation does not support this mode, then HTTP/1.1 may be used
- Returns:
- the HTTP protocol version requested
executor
Returns anOptionalcontaining this client'sExecutor. If noExecutorwas set in the client's builder, then theOptionalis empty.Even though this method may return an empty optional, the
HttpClientmay still have an non-exposeddefault executor that is used for executing asynchronous and dependent tasks.- Returns:
- an
Optionalcontaining this client'sExecutor
send
public abstract <T> HttpResponse<T> send(HttpRequest request,HttpResponse.BodyHandler<T> responseBodyHandler) throwsIOException,InterruptedException Sends the given request using this client, blocking if necessary to get the response. The returnedHttpResponse<T>contains the response status, headers, and body ( as handled by given response body handler ).If the operation is interrupted, the default
HttpClientimplementation attempts to cancel the HTTP exchange andInterruptedExceptionis thrown. No guarantee is made as to exactlywhen the cancellation request may be taken into account. In particular, the request might still get sent to the server, as its processing might already have started asynchronously in another thread, and the underlying resources may only be released asynchronously.- With HTTP/1.1, an attempt to cancel may cause the underlying connection to be closed abruptly.
- With HTTP/2, an attempt to cancel may cause the stream to be reset, or in certain circumstances, may also cause the connection to be closed abruptly, if, for instance, the thread is currently trying to write to the underlying socket.
- Type Parameters:
T- the response body type- Parameters:
request- the requestresponseBodyHandler- the response body handler- Returns:
- the response
- Throws:
IOException- if an I/O error occurs when sending or receivingInterruptedException- if the operation is interruptedIllegalArgumentException- if therequestargument is not a request that could have been validly built as specified byHttpRequest.Builder.SecurityException- If a security manager has been installed and it deniesaccessto the URL in the given request, or proxy if one is configured. Seesecurity checks for further information.
sendAsync
public abstract <T>CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest request,HttpResponse.BodyHandler<T> responseBodyHandler) Sends the given request asynchronously using this client with the given response body handler.Equivalent to:
sendAsync(request, responseBodyHandler, null).- Type Parameters:
T- the response body type- Parameters:
request- the requestresponseBodyHandler- the response body handler- Returns:
- a
CompletableFuture<HttpResponse<T>> - Throws:
IllegalArgumentException- if therequestargument is not a request that could have been validly built as specified byHttpRequest.Builder.
sendAsync
public abstract <T>CompletableFuture<HttpResponse<T>> sendAsync(HttpRequest request,HttpResponse.BodyHandler<T> responseBodyHandler,HttpResponse.PushPromiseHandler<T> pushPromiseHandler) Sends the given request asynchronously using this client with the given response body handler and push promise handler.The returned completable future, if completed successfully, completes with an
HttpResponse<T>that contains the response status, headers, and body ( as handled by given response body handler ).Push promises received, if any, are handled by the given
pushPromiseHandler. AnullvaluedpushPromiseHandlerrejects any push promises.The returned completable future completes exceptionally with:
IOException- if an I/O error occurs when sending or receivingSecurityException- If a security manager has been installed and it deniesaccessto the URL in the given request, or proxy if one is configured. Seesecurity checks for further information.
The default
HttpClientimplementation returnsCompletableFutureobjects that arecancelable.CompletableFutureobjectsderived from cancelable futures are themselvescancelable. Invokingcancel(true) on a cancelable future that is not completed, attempts to cancel the HTTP exchange in an effort to release underlying resources as soon as possible. No guarantee is made as to exactlywhen the cancellation request may be taken into account. In particular, the request might still get sent to the server, as its processing might already have started asynchronously in another thread, and the underlying resources may only be released asynchronously.- With HTTP/1.1, an attempt to cancel may cause the underlying connection to be closed abruptly.
- With HTTP/2, an attempt to cancel may cause the stream to be reset.
- Type Parameters:
T- the response body type- Parameters:
request- the requestresponseBodyHandler- the response body handlerpushPromiseHandler- push promise handler, may be null- Returns:
- a
CompletableFuture<HttpResponse<T>> - Throws:
IllegalArgumentException- if therequestargument is not a request that could have been validly built as specified byHttpRequest.Builder.
newWebSocketBuilder
Creates a newWebSocketbuilder (optional operation).Example
HttpClient client = HttpClient.newHttpClient(); CompletableFuture<WebSocket> ws = client.newWebSocketBuilder() .buildAsync(URI.create("ws://websocket.example.com"), listener);Finer control over the WebSocket Opening Handshake can be achieved by using a custom
HttpClient.Example
InetSocketAddress addr = new InetSocketAddress("proxy.example.com", 80); HttpClient client = HttpClient.newBuilder() .proxy(ProxySelector.of(addr)) .build(); CompletableFuture<WebSocket> ws = client.newWebSocketBuilder() .buildAsync(URI.create("ws://websocket.example.com"), listener);- Implementation Requirements:
- The default implementation of this method throws
UnsupportedOperationException. Clients obtained throughnewHttpClient()ornewBuilder()return aWebSocketbuilder. - Implementation Note:
- Both builder and
WebSockets created with it operate in a non-blocking fashion. That is, their methods do not block before returning aCompletableFuture. Asynchronous tasks are executed in thisHttpClient's executor.When a
CompletionStagereturned fromListener.onClosecompletes, theWebSocketwill send a Close message that has the same code the received message has and an empty reason. - Returns:
- a
WebSocket.Builder - Throws:
UnsupportedOperationException- if thisHttpClientdoes not provide WebSocket support