在java 世界蜒简,似乎apache httpClient已然成為http請(qǐng)求事實(shí)標(biāo)準(zhǔn)拉宗,在各種開源和商業(yè)項(xiàng)目中只要涉及到http請(qǐng)求的地方咖祭,都能看到它的身影。
如此重要的核心組件砾赔,是非常有必要了解它的核心原理的蝌箍。在了解各個(gè)細(xì)節(jié)之前,我們先來看下httpClient的整體執(zhí)行流程暴心。
這里的代碼分析是基于httpClient3.1版本
從上面的執(zhí)行流程來看十绑,httpClient在執(zhí)行http方法時(shí)是通過HttpMethodDirctor來做的。整個(gè)請(qǐng)求的執(zhí)行基本上都是下面的流程酷勺。
從上面的流程來看,httpClient會(huì)先使用ConnectionManager獲取connection扳躬,connectionManager的不同實(shí)現(xiàn)的差別脆诉,在HttpClient ConnectionManager會(huì)詳細(xì)介紹。獲取connection后進(jìn)行authenticate贷币,這里的authenticate 就是http協(xié)議的中的身份驗(yàn)證击胜。httpClient支持三種驗(yàn)證方式:NTLM、Digest役纹、Basic偶摔。這三種驗(yàn)證方式的差別,后續(xù)在單獨(dú)的文章中再詳細(xì)講解促脉。
對(duì)于execute辰斋,就是在循環(huán)中執(zhí)行httpMethod的execute方法,如果執(zhí)行成功瘸味,則跳出循環(huán)宫仗;如果出現(xiàn)IOException,就會(huì)使用retryHandler.retryMethod來檢查是否超過執(zhí)行次數(shù)旁仿,如果超過了則會(huì)拋出異常藕夫。
對(duì)于redirct比較好理解,就是對(duì)重定向的處理枯冈,如果response statusCodes是302毅贮、301、303尘奏、307中的一種滩褥,并且httpMethod設(shè)置了followRedirects=true,則httpClient則會(huì)從響應(yīng)頭中的location字段獲取重定向的目的url罪既,將當(dāng)前method的uri設(shè)置為redirectURI铸题。
releaseConnection從表面上理解就是釋放連接铡恕,httpConnection的releaseConnection會(huì)由httpConnectionManager.releaseConnection來執(zhí)行,最終走到ConnectionPool的freeConnection丢间。