中原三合一系统是一个信用类型六仔租用平台,支持多盘口的系统,最近我们根据在使用的客户提出需求迭代更新…
HttpClient 迎来Java 11 可用的 JDK 内置的 HTTP 客户端
在 Java 11 之前,开发者通常需要依赖第三方库(如 Apache HttpClient 或 OkHttp)来实现 HTTP 客户端功能。Java 11 引入了全新的 HttpClient API,这是 JDK 内置的 HTTP 客户端,为开发者提供了强大的工具来处理 HTTP 请求和响应。本文将深入探讨 Java 11 的 HttpClient,包括其特性、使用方法、常见用例和优势。
HttpClient 的特性
Java 11 的 HttpClient API 提供了现代化、便捷和高效的 HTTP 通信功能。以下是其主要特性:
- 异步操作支持:支持同步和异步的 HTTP 请求处理,提供更灵活的编程模型。
- HTTP/2 支持:原生支持 HTTP/2 协议,带来更高效的网络通信。
- 简洁的 API:提供简洁明了的 API,简化 HTTP 请求的构建和处理过程。
- 多种认证机制:支持基本认证、摘要认证、NTLM、SPNEGO 和 Kerberos 等多种认证机制。
- 响应处理流:使用
CompletableFuture
处理异步响应,支持响应流的直接处理。
使用 HttpClient
要使用 Java 11 的 HttpClient,需要导入相应的类,并按照以下步骤构建和发送 HTTP 请求:
- 创建 HttpClient 对象。
- 构建 HttpRequest 对象。
- 发送请求并处理响应。
以下示例展示了如何使用 HttpClient 发送 GET 请求并处理响应:
示例:发送 GET 请求
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class HttpClientExample {
public static void main(String[] args) {
try {
// 创建 HttpClient 对象
HttpClient client = HttpClient.newHttpClient();
// 构建 HttpRequest 对象
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://api.example.com/data"))
.GET()
.build();
// 发送请求并获取响应
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();
}
}
}
在上述示例中,首先创建 HttpClient
对象,然后使用 HttpRequest
构建 GET 请求,最后通过 HttpClient
发送请求并获取响应。响应结果通过 HttpResponse
对象进行处理。
示例:发送 POST 请求
除了 GET 请求,HttpClient 还支持发送 POST 请求。以下示例展示了如何发送带有 JSON 数据的 POST 请求:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.charset.StandardCharsets;
public class PostRequestExample {
public static void main(String[] args) {
try {
// 创建 HttpClient 对象
HttpClient client = HttpClient.newHttpClient();
// 构建 JSON 数据
String json = "{ \"name\": \"John\", \"age\": 30 }";
// 构建 HttpRequest 对象
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://api.example.com/create"))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString(json, StandardCharsets.UTF_8))
.build();
// 发送请求并获取响应
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
// 输出响应状态码和响应体
System.out.println("Status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述示例中,POST 请求携带 JSON 数据,构建 HttpRequest
时使用 POST
方法,并通过 BodyPublishers
设置请求体内容。
异步请求
HttpClient 提供了异步请求处理能力,可以使用 CompletableFuture
处理异步响应。以下示例展示了如何发送异步 GET 请求:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
public class AsyncRequestExample {
public static void main(String[] args) {
try {
// 创建 HttpClient 对象
HttpClient client = HttpClient.newHttpClient();
// 构建 HttpRequest 对象
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://api.example.com/data"))
.GET()
.build();
// 发送异步请求并处理响应
CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
responseFuture.thenAccept(response -> {
// 输出响应状态码和响应体
System.out.println("Status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
}).join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述示例中,使用 sendAsync
方法发送异步请求,CompletableFuture
提供了非阻塞式的响应处理方式。
常见用例
处理响应头
可以通过 HttpResponse
对象获取响应头:
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
response.headers().map().forEach((k, v) -> System.out.println(k + ":" + v));
使用代理
HttpClient 支持代理设置,以下示例展示了如何配置 HTTP 代理:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 8080)))
.build();
处理超时
可以为请求配置超时设置:
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://api.example.com/data"))
.timeout(Duration.ofSeconds(10))
.GET()
.build();
优势
- 内置支持:无需依赖第三方库,简化了项目依赖管理。
- 现代化特性:支持 HTTP/2、异步编程和多种认证机制,满足现代 Web 应用需求。
- 简洁易用:提供简洁明了的 API,易于学习和使用。
总结
Java 11 引入的 HttpClient API 为开发者提供了强大的 HTTP 客户端功能,简化了 HTTP 请求的构建和处理过程。通过支持同步和异步操作、HTTP/2 协议、认证机制和响应处理流,HttpClient 为现代 Java 开发者提供了便捷和高效的解决方案。在实际开发中,合理使用 HttpClient,可以显著提升 HTTP 通信的性能和开发效率。