Java的HTTP客户端API经历了多次演进,从早期的HttpURLConnection
到第三方库如Apache HttpClient,再到Java 11引入的标准HttpClient
。本文将全面解析Java中主要的HTTP客户端API,包括特性对比、使用方法和最佳实践。
Java 11 HttpClient API包含三个核心类:
主要特性:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
CompletableFuture> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
future.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
Map
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // 强制使用HTTP/2
.connectTimeout(Duration.ofSeconds(10))
.followRedirects(HttpClient.Redirect.NORMAL)
.executor(Executors.newVirtualThreadPerTaskExecutor()) // Java 21+虚拟线程
.build();
配置选项包括:
虽然Java 11提供了标准HTTP客户端,但Apache HttpClient仍是广泛使用的第三方库,特别是在Java 11之前的项目中。
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://example.com/api");
CloseableHttpResponse response = httpClient.execute(httpGet);
try {
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
EntityUtils.consume(entity);
} finally {
response.close();
}
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://example.com/api");
List params = new ArrayList<>();
params.add(new BasicNameValuePair("param1", "value1"));
params.add(new BasicNameValuePair("param2", "value2"));
httpPost.setEntity(new UrlEncodedFormEntity(params));
CloseableHttpResponse response = httpClient.execute(httpPost);
// 处理响应同上
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200); // 最大连接数
cm.setDefaultMaxPerRoute(20); // 每个路由最大连接数
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
虽然已被取代,但在旧代码中仍可能遇到:
try {
URL url = new URL("https://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
if (connection.getResponseCode() == 200) {
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}
缺点:
特性 | Java 11 HttpClient | Apache HttpClient | HttpURLConnection |
---|---|---|---|
HTTP/2支持 | 是 | 否 | 否 |
WebSocket支持 | 是 | 否 | 否 |
同步/异步模型 | 双模型 | 同步 | 同步 |
连接池管理 | 内置 | 支持 | 不支持 |
认证方案 | 基本 | 丰富 | 有限 |
需要额外依赖 | 否 | 是 | 否 |
现代API设计 | 是 | 部分 | 否 |
Java HTTP客户端API的演进反映了Java生态对现代网络编程需求的响应。根据项目需求和Java版本选择合适的HTTP客户端,可以显著提升开发效率和应用程序性能。