Apache HttpClient 是 Apache HttpComponents 项目中的核心组件,作为一个功能强大的 Java HTTP 客户端库,它封装了底层 TCP/IP 通信细节,提供了丰富的 API 来支持 HTTP/1.1 和 HTTP/2 协议。本文将从核心功能、常用方法、高级配置到实战场景,深入解析 HttpClient 的使用。
一、核心功能与组件
1. 核心接口与类
CloseableHttpClient
:线程安全的 HTTP 客户端接口,用于执行请求。HttpRequestBase
:抽象类,HttpGet
、HttpPost
、HttpPut
、HttpDelete
等继承自它,分别对应不同 HTTP 方法。CloseableHttpResponse
:封装响应数据,包括状态码、响应头和响应体。
2. 关键功能
- 支持所有 HTTP 方法:GET、POST、PUT、DELETE、HEAD、OPTIONS 等。
- 连接池管理:复用 TCP 连接,提升性能。
- 重试机制:自动处理网络异常或服务器超时。
- 代理与 SSL/TLS 支持:支持代理服务器和 HTTPS 通信。
- 自动重定向:默认启用,可配置最大重定向次数。
二、常用方法与示例
1. 创建 HTTP 客户端
// 默认配置的客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 自定义配置的客户端(连接池、超时时间等)
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(5000)
.setSocketTimeout(5000)
.build();
CloseableHttpClient customClient = HttpClients.custom()
.setDefaultRequestConfig(config)
.build();
2. 发送 GET 请求
HttpGet httpGet = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
int statusCode = response.getStatusLine().getStatusCode();
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("状态码: " + statusCode + ", 响应体: " + responseBody);
}
3. 发送 POST 请求(JSON 格式)
HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
StringEntity entity = new StringEntity(json, "UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
System.out.println("响应状态: " + response.getStatusLine());
}
4. 发送 PUT/DELETE 请求
// PUT 示例
HttpPut httpPut = new HttpPut("https://jsonplaceholder.typicode.com/posts/1");
httpPut.setEntity(new StringEntity("{\"title\":\"updated\"}", "UTF-8"));
// DELETE 示例
HttpDelete httpDelete = new HttpDelete("https://jsonplaceholder.typicode.com/posts/1");
三、高级配置与场景
1. 连接池配置
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(100); // 最大连接数
cm.setDefaultMaxPerRoute(20); // 每个路由的最大连接数
CloseableHttpClient pooledClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
2. 代理服务器配置
HttpHost proxy = new HttpHost("proxy.example.com", 8080);
CloseableHttpClient proxyClient = HttpClients.custom()
.setProxy(proxy)
.build();
3. SSL/TLS 配置(信任所有证书)
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial((chain, authType) -> true) // 信任所有证书(仅用于测试)
.build();
CloseableHttpClient sslClient = HttpClients.custom()
.setSSLContext(sslContext)
.build();
4. Cookie 管理
CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("session_id", "12345");
cookie.setDomain("example.com");
cookieStore.addCookie(cookie);
CloseableHttpClient cookieClient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
四、实战场景与最佳实践
1. 调用 RESTful API
// 发送带认证头的 GET 请求
HttpGet apiGet = new HttpGet("https://api.example.com/data");
apiGet.setHeader("Authorization", "Bearer token123");
try (CloseableHttpResponse response = httpClient.execute(apiGet)) {
if (response.getStatusLine().getStatusCode() == 200) {
String jsonResponse = EntityUtils.toString(response.getEntity());
System.out.println("API 响应: " + jsonResponse);
}
}
2. 文件上传(Multipart)
HttpPost uploadPost = new HttpPost("https://example.com/upload");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody("field1", "value1");
builder.addBinaryBody("file", new File("test.txt"));
HttpEntity multipart = builder.build();
uploadPost.setEntity(multipart);
try (CloseableHttpResponse response = httpClient.execute(uploadPost)) {
System.out.println("上传结果: " + response.getStatusLine());
}
3. 最佳实践
- 资源释放:使用
try-with-resources
确保CloseableHttpClient
和CloseableHttpResponse
被正确关闭。 - 异常处理:捕获
IOException
和HttpException
,根据业务需求处理。 - 连接池优化:根据并发量调整最大连接数和每个路由的最大连接数。
- 日志记录:记录请求和响应的详细信息,便于调试。
五、总结
Apache HttpClient 是一个功能强大、灵活的 HTTP 客户端库,适用于各种 Java 应用场景。通过本文的讲解,你应该能够掌握以下内容:
- 核心组件:
CloseableHttpClient
、HttpRequestBase
、CloseableHttpResponse
等。 - 常用方法:GET、POST、PUT、DELETE 等请求的发送方式。
- 高级配置:连接池、代理、SSL/TLS、Cookie 管理等。
- 实战场景:RESTful API 调用、文件上传等。
在实际项目中,合理使用 HttpClient 可以显著提升 HTTP 通信的效率和可靠性。建议结合官方文档和示例代码,进一步探索 HttpClient 的高级功能。