Apache HttpClient 4.5.x 学习总结八:Aborting requests(请求终止)和Redirect handling(重定向)

通俗解释:

场景类比:快递员送包裹

  1. 终止请求

    • 快递员送货卡在半路(请求阻塞)
    • 你拨打紧急终止电话abort())→ 快递员立即放弃任务并返回(抛出异常释放资源)
  2. 重定向处理

    • 快递员发现收件人搬家(302重定向):
      • 普通模式
        ✅ 新地址在同城 → 自动转送
        ❌ 新地址需空运(违反规则)→ 停止配送
      • 宽松模式LaxRedirectStrategy):
        ✅ 无论空运/海运 → 强制转送
  3. 追踪最终地址

    记录 = {
      起点: 北京仓库(原始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(数据丢失风险)
  • 最终地址追踪对调试爬虫/支付回调等场景至关重要
posted @ 2025-07-24 10:22  hqq的进阶日记  阅读(41)  评论(0)    收藏  举报