上一篇
httpclient中文api
- 行业动态
- 2025-04-30
- 2400
Apache HttpClient提供HTTP请求与响应处理,含中文
HttpClient 核心组件与功能
HttpClient 类
- 作用:客户端核心入口,负责执行 HTTP 请求并返回响应。
- 线程安全:实例本身是线程安全的,但建议通过
CloseableHttpClient
配合连接管理器复用。 - 创建方式:
- 基础工厂方法:
HttpClients.createDefault()
(默认配置) - 自定义配置:通过
HttpClientBuilder
构建
- 基础工厂方法:
方法名 | 说明 |
---|---|
execute(HttpUriRequest) | 执行请求并返回 CloseableHttpResponse |
execute(HttpHost, HttpRequest) | 指定目标主机执行请求 |
HttpRequest 接口
- 实现类:
HttpGet
、HttpPost
、HttpPut
、HttpDelete
等。 - 关键方法:
setURI(URI uri)
:设置请求路径setHeader(String name, String value)
:添加请求头addParameter(BasicNameValuePair)
:POST 表单参数(仅限HttpPost
)
HttpResponse 接口
- 实现类:
BasicHttpResponse
(实际返回对象)。 - 状态码获取:
int statusCode = response.getStatusLine().getStatusCode();
- 响应体读取:
HttpEntity entity = response.getEntity(); String body = EntityUtils.toString(entity, "UTF-8");
常用配置与高级功能
连接管理器
- 目的:控制连接复用、超时等。
- 配置示例:
RequestConfig config = RequestConfig.custom() .setConnectTimeout(5000) // 连接超时(毫秒) .setSocketTimeout(10000) // 读数据超时 .setConnectionRequestTimeout(2000) // 从连接池获取连接超时 .build();
- 整合到客户端:
CloseableHttpClient client = HttpClients.custom() .setDefaultRequestConfig(config) .build();
拦截器(Interceptor)
- 作用:在请求/响应流程中插入自定义逻辑(如日志、签名)。
- 实现方式:
client = HttpClients.custom() .addInterceptorFirst(new LoggingInterceptor()) // 前置拦截器 .addInterceptorLast(new RetryInterceptor()) // 后置拦截器 .build();
SSL 证书处理
- 信任所有证书(开发环境慎用):
SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{new X509TrustManager(){ public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return null; } }}, new SecureRandom());
- 整合到客户端:
CloseableHttpClient client = HttpClients.custom() .setSSLContext(sslContext) .build();
异常处理与调试
异常类型 | 触发场景 | 解决方案 |
---|---|---|
NoHttpResponseException | 服务器未响应 | 检查网络或服务器状态 |
UnknownHostException | 域名解析失败 | 确认域名正确性或 DNS 配置 |
SSLException | SSL 握手失败 | 验证证书或调整信任策略 |
相关问题与解答
问题1:如何实现连接池管理?
解答:
使用 PoolingHttpClientConnectionManager
配置最大连接数:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(200); // 总连接数 cm.setDefaultMaxPerRoute(20); // 每个路由的连接数 CloseableHttpClient client = HttpClients.custom() .setConnectionManager(cm) .build();
问题2:如何发送异步 HTTP 请求?
解答:
利用 FutureRequestExecutionService
或线程池:
public void asyncRequest() throws Exception { HttpGet request = new HttpGet("http://example.com"); Future<HttpResponse> future = client.execute(request, null); // 非阻塞调用 // 其他逻辑... HttpResponse response = future.get(); // 等待结果 }