Apache HttpClient 4.5.x 學(xué)習(xí)總結(jié)一:核心組件簡(jiǎn)介
在工作中,搭建接口自動(dòng)化框架時(shí),使用了Apache HttpClient 庫發(fā)起HTTP請(qǐng)求,故系統(tǒng)化總結(jié)一下其中的知識(shí)點(diǎn)
1.什么是Apache HttpClient 4.5.x
Apache HttpClient 4.5.x 是一個(gè)功能強(qiáng)大的 Java HTTP 客戶端庫,其核心組件設(shè)計(jì)遵循模塊化原則。
2.HTTPClient不是什么
httpclient不是瀏覽器。它是客戶端HTTP傳輸庫。 HTTPClient的目的是傳輸和接收HTTP消息。
HTTPClient不會(huì)嘗試處理內(nèi)容,執(zhí)行嵌入在HTML頁面中的JavaScript,嘗試猜測(cè)內(nèi)容類型(如果未明確設(shè)置),或重新格式化請(qǐng)求 /重寫位置URI或與HTTP傳輸無關(guān)的其他功能。
3.HTTPClient的典型請(qǐng)求流程
創(chuàng)建HTTPClient --》構(gòu)造請(qǐng)求對(duì)象:HTTPGet/HttpPost --》配置請(qǐng)求參數(shù)/實(shí)體 --》執(zhí)行請(qǐng)求execute --》獲取HttpResponse --》處理響應(yīng)狀態(tài)/實(shí)體 --》釋放連接
HTTPClient的核心組件
1. HttpClient 接口
- 核心入口點(diǎn):所有 HTTP 請(qǐng)求的執(zhí)行入口
- 關(guān)鍵實(shí)現(xiàn)類:
CloseableHttpClient(推薦使用,支持資源自動(dòng)關(guān)閉) - 創(chuàng)建方式:
CloseableHttpClient httpClient = HttpClients.createDefault();
2. HTTP 連接管理器 (Connection Management)
HttpClientConnectionManager
- 職責(zé):管理 HTTP 連接的創(chuàng)建、分配和生命周期
- 關(guān)鍵實(shí)現(xiàn):
- PoolingHttpClientConnectionManager(生產(chǎn)推薦)
- 連接池實(shí)現(xiàn),支持多線程
- 可配置參數(shù):
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(200); // 最大連接數(shù) cm.setDefaultMaxPerRoute(20); // 每個(gè)路由的最大連接數(shù)
- BasicHttpClientConnectionManager:?jiǎn)芜B接管理器(僅測(cè)試用)
- PoolingHttpClientConnectionManager(生產(chǎn)推薦)
3. HTTP 請(qǐng)求執(zhí)行器 (HttpRequestExecutor)
- 職責(zé):核心執(zhí)行引擎,處理請(qǐng)求/響應(yīng)的編解碼
- 工作流程:
請(qǐng)求準(zhǔn)備 → 發(fā)送 → 接收響應(yīng) → 解析 - 通常通過
HttpClient隱式調(diào)用,無需直接操作
4. HTTP 消息實(shí)體 (HttpEntity)
- 職責(zé):封裝 HTTP 消息體(請(qǐng)求體或響應(yīng)體)
- 常用實(shí)現(xiàn):
StringEntity:字符串內(nèi)容ByteArrayEntity:字節(jié)數(shù)組FileEntity:文件流UrlEncodedFormEntity:表單數(shù)據(jù)(如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)
- 職責(zé):跨請(qǐng)求的會(huì)話狀態(tài)容器(類似
Map<String, Object>) - 典型用途:
- 保持登錄狀態(tài)(Cookie 持久化)
- 重定向跟蹤
- 認(rèn)證信息傳遞
- 實(shí)現(xiàn)類:
BasicHttpContext,HttpClientContextHttpClientContext context = HttpClientContext.create(); httpClient.execute(request, context); CookieStore cookies = context.getCookieStore(); // 獲取Cookies
6. 攔截器 (Interceptors)
- 請(qǐng)求攔截器 (
HttpRequestInterceptor)- 修改請(qǐng)求頭、記錄日志等
- 響應(yīng)攔截器 (
HttpResponseInterceptor)- 處理 GZIP 壓縮、錯(cuò)誤響應(yīng)等
- 配置示例:
CloseableHttpClient client = HttpClients.custom() .addInterceptorLast((HttpResponseInterceptor) (response, context) -> { // 自動(dòng)解壓GZIP響應(yīng) if (response.containsHeader("Content-Encoding")) { response.removeHeaders("Content-Encoding"); } }) .build();
7. 重定向策略 (RedirectStrategy)
- 默認(rèn)實(shí)現(xiàn):
LaxRedirectStrategy(自動(dòng)處理 30x 重定向) - 自定義重定向:
HttpClientBuilder.create() .setRedirectStrategy(new CustomRedirectStrategy()) .build();
8. 認(rèn)證機(jī)制 (Authentication)
- 支持方案:Basic、Digest、NTLM、Kerberos
- 核心組件:
CredentialsProvider:憑證存儲(chǔ)BasicCredentialsProvider creds = new BasicCredentialsProvider(); creds.setCredentials(new AuthScope("host", 80), new UsernamePasswordCredentials("user", "pass"));AuthCache:預(yù)存認(rèn)證信息AuthenticationStrategy:認(rèn)證流程控制
9. Cookie 管理 (Cookie Management)
- CookieStore:Cookie 存儲(chǔ)接口(默認(rèn)
BasicCookieStore) - CookieSpec:Cookie 策略(RFC 標(biāo)準(zhǔn))
- 配置示例:
CloseableHttpClient client = HttpClients.custom() .setDefaultCookieStore(new BasicCookieStore()) .setDefaultCookieSpecRegistry(registry) .build();
10. SSL/TLS 配置
- 關(guān)鍵組件:
SSLContext:自定義證書/信任策略HostnameVerifier:主機(jī)名驗(yàn)證(可繞過)
- 示例(繞過證書驗(yàn)證 - 僅測(cè)試環(huán)境用):
SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial((chain, authType) -> true) // 信任所有證書 .build(); CloseableHttpClient client = HttpClients.custom() .setSSLContext(sslContext) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build();
最佳實(shí)踐
- 連接池必用:生產(chǎn)環(huán)境務(wù)必配置
PoolingHttpClientConnectionManager - 資源釋放:
try (CloseableHttpResponse response = httpClient.execute(request)) { // 處理響應(yīng) } // 自動(dòng)關(guān)閉連接 - 性能調(diào)優(yōu):
- 合理設(shè)置連接池參數(shù)
- 復(fù)用
HttpClient實(shí)例(線程安全)
- 異常處理:捕獲
IOException并實(shí)現(xiàn)重試邏輯
浙公網(wǎng)安備 33010602011771號(hào)