Apache HttpClient 4.5.x 学习总结一:核心组件简介
在工作中,搭建接口自动化框架时,使用了Apache HttpClient 库发起HTTP请求,故系统化总结一下其中的知识点
1.什么是Apache HttpClient 4.5.x
Apache HttpClient 4.5.x 是一个功能强大的 Java HTTP 客户端库,其核心组件设计遵循模块化原则。
2.HTTPClient不是什么
httpclient不是浏览器。它是客户端HTTP传输库。 HTTPClient的目的是传输和接收HTTP消息。
HTTPClient不会尝试处理内容,执行嵌入在HTML页面中的JavaScript,尝试猜测内容类型(如果未明确设置),或重新格式化请求 /重写位置URI或与HTTP传输无关的其他功能。
3.HTTPClient的典型请求流程
创建HTTPClient --》构造请求对象:HTTPGet/HttpPost --》配置请求参数/实体 --》执行请求execute --》获取HttpResponse --》处理响应状态/实体 --》释放连接
HTTPClient的核心组件
1. HttpClient 接口
- 核心入口点:所有 HTTP 请求的执行入口
- 关键实现类:
CloseableHttpClient(推荐使用,支持资源自动关闭) - 创建方式:
CloseableHttpClient httpClient = HttpClients.createDefault();
2. HTTP 连接管理器 (Connection Management)
HttpClientConnectionManager
- 职责:管理 HTTP 连接的创建、分配和生命周期
- 关键实现:
- PoolingHttpClientConnectionManager(生产推荐)
- 连接池实现,支持多线程
- 可配置参数:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(200); // 最大连接数 cm.setDefaultMaxPerRoute(20); // 每个路由的最大连接数
- BasicHttpClientConnectionManager:单连接管理器(仅测试用)
- PoolingHttpClientConnectionManager(生产推荐)
3. HTTP 请求执行器 (HttpRequestExecutor)
- 职责:核心执行引擎,处理请求/响应的编解码
- 工作流程:
请求准备 → 发送 → 接收响应 → 解析 - 通常通过
HttpClient隐式调用,无需直接操作
4. HTTP 消息实体 (HttpEntity)
- 职责:封装 HTTP 消息体(请求体或响应体)
- 常用实现:
StringEntity:字符串内容ByteArrayEntity:字节数组FileEntity:文件流UrlEncodedFormEntity:表单数据(如name=value&age=20)
- 使用示例:
HttpPost post = new HttpPost("http://example.com"); List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("key", "value")); post.setEntity(new UrlEncodedFormEntity(params));
5. HTTP 上下文 (HttpContext)
- 职责:跨请求的会话状态容器(类似
Map<String, Object>) - 典型用途:
- 保持登录状态(Cookie 持久化)
- 重定向跟踪
- 认证信息传递
- 实现类:
BasicHttpContext,HttpClientContextHttpClientContext context = HttpClientContext.create(); httpClient.execute(request, context); CookieStore cookies = context.getCookieStore(); // 获取Cookies
6. 拦截器 (Interceptors)
- 请求拦截器 (
HttpRequestInterceptor)- 修改请求头、记录日志等
- 响应拦截器 (
HttpResponseInterceptor)- 处理 GZIP 压缩、错误响应等
- 配置示例:
CloseableHttpClient client = HttpClients.custom() .addInterceptorLast((HttpResponseInterceptor) (response, context) -> { // 自动解压GZIP响应 if (response.containsHeader("Content-Encoding")) { response.removeHeaders("Content-Encoding"); } }) .build();
7. 重定向策略 (RedirectStrategy)
- 默认实现:
LaxRedirectStrategy(自动处理 30x 重定向) - 自定义重定向:
HttpClientBuilder.create() .setRedirectStrategy(new CustomRedirectStrategy()) .build();
8. 认证机制 (Authentication)
- 支持方案:Basic、Digest、NTLM、Kerberos
- 核心组件:
CredentialsProvider:凭证存储BasicCredentialsProvider creds = new BasicCredentialsProvider(); creds.setCredentials(new AuthScope("host", 80), new UsernamePasswordCredentials("user", "pass"));AuthCache:预存认证信息AuthenticationStrategy:认证流程控制
9. Cookie 管理 (Cookie Management)
- CookieStore:Cookie 存储接口(默认
BasicCookieStore) - CookieSpec:Cookie 策略(RFC 标准)
- 配置示例:
CloseableHttpClient client = HttpClients.custom() .setDefaultCookieStore(new BasicCookieStore()) .setDefaultCookieSpecRegistry(registry) .build();
10. SSL/TLS 配置
- 关键组件:
SSLContext:自定义证书/信任策略HostnameVerifier:主机名验证(可绕过)
- 示例(绕过证书验证 - 仅测试环境用):
SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial((chain, authType) -> true) // 信任所有证书 .build(); CloseableHttpClient client = HttpClients.custom() .setSSLContext(sslContext) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build();
最佳实践
- 连接池必用:生产环境务必配置
PoolingHttpClientConnectionManager - 资源释放:
try (CloseableHttpResponse response = httpClient.execute(request)) { // 处理响应 } // 自动关闭连接 - 性能调优:
- 合理设置连接池参数
- 复用
HttpClient实例(线程安全)
- 异常处理:捕获
IOException并实现重试逻辑
浙公网安备 33010602011771号