前面写了两篇HttpClient和HtmlUnit和文章,然后就很久没有更新了,真的是有事,现在闲下来,把N久没动的博客也更新一下吧,因为上次的HttpClient方面讲的比较少嘛,这篇文章也正好补一下。
写博客之前也看了下网上其他人写的文章,也有很多解读HttpClient源码的,但是都是版本HttpClient4.1之前的,这里我先把我看到的一篇比较好的解读HttpClient源码的文章和大家一起分享一下:http://www.educity.cn/wenda/147389.html。
今天主要是讲解HttpClient4.3版本的源码,4.3改动还是有一点的,主要是对于“链”的概念更加浓重了。
一、HttpClient 执行步骤
先来看一下,HttpClient4.0大致的时序图。
(看的清楚么,我画的时候已经很注意字体大小以及截图的时候的清晰度了,如果实在看不清只能自己纯看文字了。)
你也可以参考下我上面分享的那篇文章里面的时序图,对比下HttpClient4.3版本做了哪些改变。
已请求一个正常的POST流为例,我们来看下HttpClient是如何执行的:
1、首先你需要建立一个HttpClient,设置这个HttpClient的一些基本属性,这其中包括HTTPS处理策略,连接超时时间,Cookie策略,连接池等等,这些都可以通过搜索HttpClient4.0+ 的教程学习。
2、执行HttpClient的execute方法,这个时候你会发现实际走向是 HttpClient -> CloseableHttpClient -> InternalHttpClient ,然后在doExecute()方法中进行了一些基本判断,初始化值之后,就进入了ClientExecChain(MainClientExec)的execute()方法。
3、然后我们可以简单看下MainClientExec的execute方法。
// @CaiBo
public CloseableHttpResponse execute(final HttpRoute route, final HttpRequestWrapper request, final HttpClientContext context,
final HttpExecutionAware execAware) throws IOException, HttpException {
// 判断是否为空(Args这个工具类将经常出现)
Args.notNull(route, "HTTP route");
Args.notNull(request, "HTTP request");
Args.notNull(context, "HTTP context");
// 看到Auth相关的直接跳过,这和认证(HTTPS等)相关,我们暂时不理会,直接往下看
AuthState targetAuthState = context.getTargetAuthState();
if (targetAuthState == null) {
targetAuthState = new AuthState();
context.setAttribute(HttpClientContext.TARGET_AUTH_STATE, targetAuthState);
}
AuthState proxyAuthState = context.getProxyAuthState();
if (proxyAuthState == null) {
proxyAuthState = new AuthState();
context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, proxyAuthState);
}