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号