In Java 11, HttpClient
was introduced as part of the java.net.http
package, providing a modern, fully asynchronous, and flexible HTTP client API to replace the older HttpURLConnection
. It supports HTTP/1.1, HTTP/2, synchronous and asynchronous requests, and built-in support for handling JSON, time-outs, redirects, and authentication.
Here’s a detailed overview and examples:
1. Creating an HttpClient
import java.net.http.HttpClient;
import java.time.Duration;
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // Use HTTP/2
.connectTimeout(Duration.ofSeconds(10)) // Connection timeout
.build();
2. Sending a Synchronous GET Request
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.GET()
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
} catch (Exception e) {
e.printStackTrace();
}
3. Sending a POST Request
String json = """
{
"title": "foo",
"body": "bar",
"userId": 1
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
} catch (Exception e) {
e.printStackTrace();
}
4. Asynchronous Request (Non-blocking)
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.GET()
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join(); // Wait for completion
5. Common Features
- Timeouts:
.timeout(Duration.ofSeconds(5))
- Redirects:
.followRedirects(HttpClient.Redirect.ALWAYS)
- HTTP Versions:
.version(HttpClient.Version.HTTP_2)
or HTTP/1.1 - Custom Headers:
.header("Authorization", "Bearer token")
- Cookies:
HttpClient
can manage cookies viaCookieHandler
.
HttpClient
in Java 11 is a big improvement over HttpURLConnection
, especially for modern APIs and asynchronous programming.