> Docs > Http Client
Use HttpClient
.send()
to send a request and receive the response (asynchronously):
Async<HttpResponse> send(HttpRequest request)
For example
HttpClient client = new HttpClient(); HttpRequest request = HttpRequest.toGet("https://example.com"); Async<HttpResponse> asyncRes = client.send( request );
Or use the convenience method doGet(absoluteUri)
Async<HttpResponse> asyncRes = client.doGet( "https://example.com" );
Features include - proxy
, authentication
, cookies
, etc.
The HttpClient
API is asynchronous, see Async Programming. To demonstrate:
Async<String> asyncBody = client .doGet( "https://example.com" ) // Async<HttpResponse> .peek(response -> out.println(response.status())) .then(response -> response.bodyString(MAX_CHARS)) // Async<String> .peek(System.out::println) .finally_(client::close) ;
The response body must be closed to free the underlying connection. In the previous example, the response.bodyString()
method will close the body upon completion; bodyBytes()
would do the same.
An HttpClient
should be closed
eventually.
You may not care about Async
API; you just want to use HttpClient
in a traditional, synchronous way.
This can be done by the sync()
method on Async
actions, for example
HttpResponse response = client.doGet("https://example.com").sync(); System.out.println(response.status()); String body = response.bodyString(MAX_CHARS).sync(); System.out.println(body);
Of course, sync()
blocks the current thread, therefore you should not do this in an async environment, like in an HttpHandler
.
To submit a form to a server, you can populate a FormData
, then convert it toRequest
:
FormData form = new FormData("POST", "http://localhost:8080/upload") .param("title", "A Kitty") .file ("image", "cat.gif"); HttpRequest request = form.toRequest(); client.send(request);
HttpClient
configuration is done by HttpClientConf
, typically in the builder pattern. For example,
HttpClient client = new HttpClientConf() .proxy("127.0.0.1", 8080) .trafficDump(System.err::print) .newClient();
See also