Apache HttpClient 4.5.x 學習總結八:Aborting requests(請求終止)和Redirect handling(重定向)
通俗解釋:
場景類比:快遞員送包裹
-
終止請求
- 快遞員送貨卡在半路(請求阻塞)
- 你撥打緊急終止電話(
abort())→ 快遞員立即放棄任務并返回(拋出異常釋放資源)
-
重定向處理
- 快遞員發現收件人搬家(302重定向):
- 普通模式:
? 新地址在同城 → 自動轉送
? 新地址需空運(違反規則)→ 停止配送 - 寬松模式(
LaxRedirectStrategy):
? 無論空運/海運 → 強制轉送
- 普通模式:
- 快遞員發現收件人搬家(302重定向):
-
追蹤最終地址
記錄 = { 起點: 北京倉庫(原始URI), 中轉站: [上海分揀中心, 杭州配送站](redirectLocations), 終點: 西湖區1號樓(finalUri) }就像查看物流詳情頁的完整運輸軌跡
精簡翻譯:
1.6 終止請求
當請求因服務器高負載或客戶端并發過多而阻塞時,可調用HttpUriRequest#abort()強制終止請求:
? 線程安全:任意線程均可調用
? 即時解鎖:阻塞中的I/O操作會立即拋出InterruptedIOException釋放線程
1.7 重定向處理
HttpClient自動處理所有重定向(除HTTP規范明確禁止的):
- 303響應時,POST/PUT自動轉為GET(符合HTTP規范)
- 可通過
LaxRedirectStrategy放寬自動重定向限制:
LaxRedirectStrategy strategy = new LaxRedirectStrategy(); // 寬松重定向策略
CloseableHttpClient httpclient = HttpClients.custom()
.setRedirectStrategy(strategy)
.build();
獲取最終重定向地址:
// 執行請求后通過上下文獲取最終地址
URI finalUri = URIUtils.resolve(
originalRequest.getURI(),
context.getTargetHost(),
context.getRedirectLocations() // 重定向路徑鏈
);
System.out.println("最終地址: " + finalUri); // 輸出絕對URI
核心知識點提煉:
| 主題 | 關鍵點 |
|---|---|
| 請求終止 | abort()隨時終止請求 → 強制解除I/O阻塞 → 拋出InterruptedIOException |
| 重定向規則 | 自動處理重定向(除需人工干預的) → POST/PUT重定向時自動轉GET |
| 寬松重定向策略 | LaxRedirectStrategy可繞過HTTP對POST重定向的嚴格限制 |
| 最終地址追蹤 | 通過context.getRedirectLocations()+URIUtils.resolve()還原完整重定向路徑 |
關鍵結論:
- 請求終止是緊急逃生通道,避免線程永久阻塞
- 重定向如同快遞自動轉發,但需注意POST請求轉發可能變成GET(數據丟失風險)
- 最終地址追蹤對調試爬蟲/支付回調等場景至關重要
浙公網安備 33010602011771號