系列
简介
-
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
-
Apache Jakarta Commons HttpClient项目已经寿终正寝,不再开发和维护。取而代之的是Apache Httpcomponents项目,它包括HttpClient和HttpCore两大模块,能提供更好的性能和更大的灵活性。
-
之所以会尝试写这篇博客是因为在最近的工作中使用到了HttpClient,而对于使用的技术还是希望稍微能够理解的深入一些。
-
目前我们的使用的版本是基于4.5.x,可以从httpcomponents-client获取源码并切换到4.5.x版本后阅读example版本进行了解。
使用场景
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.14</version>
</dependency>
- httpclient的4.5.x版本需要依赖httpclient和httpcore两个依赖包,httpclient作为http请求的客户端,httpcore作为连接的管理。
public class ClientExample {
public static void main(String[] args) throws Exception {
// 1、设置连接管理器
ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory();
Registry<ConnectionSocketFactory> registry = RegistryBuilder
.<ConnectionSocketFactory> create().register("http", plainsf).register("https", sslsf).build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(1000);
cm.setDefaultMaxPerRoute(500);
// 2、创建请求配置核心设置超时
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(1000)
.setConnectTimeout(1000).setSocketTimeout(2000).build();
// 3、创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.custom()
.setConnectionManager(cm)
.setDefaultRequestConfig(requestConfig)
.build();
// 4、发送请求并解析返回值
HttpGet httpGet = new HttpGet("http://hc.apache.org/");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
// 解析返回值
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, Charset.forName("utf8"));
EntityUtils.consume(entity);
} catch (Exception e) {
} finally {
// 关闭并释放连接,可能多余
response.close();
}
}
}
- 设置连接管理器PoolingHttpClientConnectionManager,负责管理连接池。
- 创建请求配置RequestConfig并设置核心的超时属性等,核心是超时时间设置。
- 创建Httpclient对象并通过httpclient.execute操作发送请求解析结果
- 关闭连接,这部分可能是多余,因为ntityUtils.toString操作已经释放连接。
请求过程解析

- HttpClient的请求过程主要通过InternalHttpClient来实现请求过程。
- 整个执行过程中通过职责链进行操作并最终HttpRequestExecutor访问。

- HttpClient在整个访问过程中的职责链
连接池


- HttpClient的连接池使用CPool来实现,AbstractConnPool作为全局的CPool。
- routeToPool属于请求维度的线程池维护。

- 另外一种视角的CPool的整体架构。
网友评论