Java 9中引入了增强的HttpClient API作为实验性功能。在Java 11中,现在HttpClient是一个标准。
Java 11引入了一个新的标准HttpClient
API,用于替代旧的HttpURLConnection
,提供了更现代、更灵活的HTTP通信方式。这个API支持同步和异步请求、WebSocket、HTTP/2等。
介绍
主要特点
- 异步和流式处理:HttpClient支持异步请求和响应,有助于提高性能和效率。它还提供流式处理的能力,可以更有效地处理大量数据。
- 可插拔的身份验证:HttpClient可以轻松实现各种身份验证机制,为应用程序提供更强的安全性。
- 支持WebSocket:HttpClient支持WebSocket通信,使得在Java应用程序中实现实时通信变得更加容易。
- 定制化:HttpClient允许用户根据需要自定义请求和响应的处理方式,提供更大的灵活性。
- 支持HTTPS/TLS:HttpClient支持HTTPS协议和TLS加密,确保通信的安全性和隐私性。
主要组件
- HttpClient:用于发送请求的主要类,可以通过HttpClient.newBuilder()方法构建。
- HttpRequest:表示一个HTTP请求,可以设置请求方法(如GET、POST等)、请求头、请求体等。
- HttpResponse:表示一个HTTP响应,包含响应状态码、响应头、响应体等信息。
使用方法
使用Java 11的HttpClient发送HTTP请求主要包括以下步骤:
- 创建一个HttpClient对象(可选地,可以通过HttpClient.newBuilder()方法进行配置)。
- 创建一个HttpRequest对象,并设置请求方法、请求头、请求体等。
- 使用HttpClient的send()方法发送请求,并获取HttpResponse对象。
- 处理HttpResponse对象,提取响应状态码、响应头、响应体等信息。
性能优势
- 并发处理能力:HttpClient中的NIO模型、函数式编程、CompletableFuture异步回调和响应式流使其拥有极强的并发处理能力,性能极高。
- 内存占用:相比其他HTTP客户端库,HttpClient的内存占用更少,适合处理大量并发请求。
使用
以下是HttpClient
的一些基本使用示例:
创建HttpClient
可以使用HttpClient
类创建一个HttpClient实例:
HttpClient client = HttpClient.newHttpClient();
也可以使用HttpClient.Builder
类来构建一个HttpClient实例:
HttpClient.Builder builder = HttpClient.newBuilder();
builder.version(HttpClient.Version.HTTP_1_1);
HttpClient httpClient1 = builder.build();
发送同步GET请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
发送异步GET请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
发送POST请求
可以使用HttpRequest.BodyPublishers
来发送请求体。
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.POST(HttpRequest.BodyPublishers.ofString("request body"))
.header("Content-Type", "application/json")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
处理响应体
可以使用不同的响应体处理器来处理HTTP响应。
HttpResponse<Path> response = client.send(request, HttpResponse.BodyHandlers.ofFile(Paths.get("response.txt")));
System.out.println("Response saved to file: " + response.body());
设置超时和重定向策略
可以自定义HttpClient的配置,例如超时和重定向策略。
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
使用HttpClient发送异步请求并处理结果
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(body -> System.out.println("Response body: " + body))
.join();
这些示例展示了如何使用Java 11中的标准HttpClient
类来发送同步和异步HTTP请求,处理响应,并进行一些常见的配置。这使得HTTP通信变得更加简洁和现代化。