在java 世界,似乎apache httpClient已然成为http请求事实标准,在各种开源和商业项目中只要涉及到http请求的地方,都能看到它的身影。
如此重要的核心组件,是非常有必要了解它的核心原理的。在了解各个细节之前,我们先来看下httpClient的整体执行流程。
这里的代码分析是基于httpClient3.1版本
从上面的执行流程来看,httpClient在执行http方法时是通过HttpMethodDirctor来做的。整个请求的执行基本上都是下面的流程。
从上面的流程来看,httpClient会先使用ConnectionManager获取connection,connectionManager的不同实现的差别,在HttpClient ConnectionManager会详细介绍。获取connection后进行authenticate,这里的authenticate 就是http协议的中的身份验证。httpClient支持三种验证方式:NTLM、Digest、Basic。这三种验证方式的差别,后续在单独的文章中再详细讲解。
对于execute,就是在循环中执行httpMethod的execute方法,如果执行成功,则跳出循环;如果出现IOException,就会使用retryHandler.retryMethod来检查是否超过执行次数,如果超过了则会抛出异常。
对于redirct比较好理解,就是对重定向的处理,如果response statusCodes是302、301、303、307中的一种,并且httpMethod设置了followRedirects=true,则httpClient则会从响应头中的location字段获取重定向的目的url,将当前method的uri设置为redirectURI。
releaseConnection从表面上理解就是释放连接,httpConnection的releaseConnection会由httpConnectionManager.releaseConnection来执行,最终走到ConnectionPool的freeConnection。