HttpClient 301问题

问题

项目中使用到了apache的HttpClient 4.5版本来进行http操作。
最近在开发时和其他服务端使用post进行对接,有些接口报错,报错如下:

responseResult : HttpResponseProxy{HTTP/1.1 301 Moved Permanently

鉴于和运维沟通麻烦,修改域名不方便等问题,决定在自己这边做一下兼容,即返回301后自动请求新的url。

解决方案

自定义一个重定向策略,对返回值301进行处理

HttpClientBuilder.create().setRedirectStrategy(new CustomLaxRedirectStrategy()).build();static class CustomLaxRedirectStrategy extends LaxRedirectStrategy {@Overridepublic HttpUriRequest getRedirect(final HttpRequest request,final HttpResponse response,final HttpContext context) throws ProtocolException {final URI uri = getLocationURI(request, response, context);final String method = request.getRequestLine().getMethod();if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {return new HttpHead(uri);} else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {return new HttpGet(uri);} else {final int status = response.getStatusLine().getStatusCode();//针对post请求301重定向问题if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_PERMANENTLY) {return RequestBuilder.copy(request).setUri(uri).build();} else {return new HttpGet(uri);}}}}

过程

当遇到问题,最简单的就是百度。发现都是推荐使用LaxRedirectStrategy策略来解决。于是,我就改了下:HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
然后重新向问题接口发起请求。但是返回依然是301。
于是,我对execute进行断点,执行顺序如下:

在这里该方法会判断是否进行重定向以及以何种方式进行重定向。

public HttpUriRequest getRedirect(final HttpRequest request,final HttpResponse response,final HttpContext context) throws ProtocolException {final URI uri = getLocationURI(request, response, context);final String method = request.getRequestLine().getMethod();if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {return new HttpHead(uri);} else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {return new HttpGet(uri);} else {//由于不是head,也不是get,是post方法,因此进入了这里,但这里只对307进行了处理,其他都返回get请求final int status = response.getStatusLine().getStatusCode();if (status == HttpStatus.SC_TEMPORARY_REDIRECT) {return RequestBuilder.copy(request).setUri(uri).build();} else {return new HttpGet(uri);}}}

于是我自定义了重定向策略,继承自LaxRedirectStrategy,当再次请求时,就进入了自定义的getRedirect方法。此时判断status,由于是301,于是复制请求,并进行重定向。

if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_PERMANENTLY) {return RequestBuilder.copy(request).setUri(uri).build();}

HttpClient 301问题相关推荐

  1. Android网络编程使用HttpClient访问web站点

    HttpClientDemo.java界面就是两个按钮和一个文本框 /** 用HttpClientlai 来访问提交请求,接收响应* A,发送GET请求* 1,创建HttpClient对象:HttpC ...

  2. httpclient 忽略证书_对接外部接口,又一次证书问题!

    Java技术栈 www.javastack.cn 关注优质文章 作者:funnyZpC 出处:cnblogs.com/funnyzpc/p/10989813.html 最近接一外部接口,接口在本地开发 ...

  3. HttpClient 学习整理

    HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的实现,发现这个开源项目之后就有点眉目了,令人头痛的cookie问题还是有办法解决滴.在网上整理了一些东西,写得很好,寄放在这里 ...

  4. HTTPClient系统学习

    HTTP协议时Internet上使用的很多也很重要的一个协议,越来越多的java应用程序需要通过HTTP协议来访问网络资源. HTTPClient提供的主要功能: 1.实现了所有HTTP的方法(GET ...

  5. HttpClient 学习整理(转)

    来自 http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的 ...

  6. 通过FD耗尽实验谈谈使用HttpClient的正确姿势

    一段问题代码实验 在进行网络编程时,正确关闭资源是一件很重要的事.在高并发场景下,未正常关闭的资源数逐渐积累会导致系统资源耗尽,影响系统整体服务能力,但是这件重要的事情往往又容易被忽视.我们进行一个简 ...

  7. Apache HttpClient 4 3开发指南

    <Apache HttpClient 4.3开发指南> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.概述 Apache HttpCli ...

  8. HttpClient简介

    栏目:Web开发 作者:admin 日期:2015-05-02 评论:0 点击: 204 次 虽然在JDK的java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,J ...

  9. 用HttpClient来模拟浏览器GET POST

    用HttpClient来模拟浏览器GET POST 作者:jaddy0302 日期:2006-12-21       一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用 ...

最新文章

  1. 03-MySQL多表操作
  2. 嘿,开发者,你的坑,我来填!
  3. 第一章:系统困境之 再努力也不能直接打开的死结
  4. easyui tree动态加载_动态路由:Gin vs SpringMVC
  5. html5页面的手势,HTML5单页面手势滑屏切换如何实现
  6. 排序算法之——快速排序分析
  7. 关于PHP微信h5棋牌程序开发数据库的备份
  8. hibernate 中文文档
  9. 聚集索引和非聚集索引的区别
  10. leetcode 热点——排列组合问题
  11. android studio如何连接夜神模拟器
  12. 【Ubuntu】查询显卡型号
  13. 一年级abb式词语并造句_abb词语造句,用ABB词语造句
  14. 深入学术研究,物理学家用VR演示弦理论猜想
  15. linkerd1.6 local安装方式文档
  16. 如何快速关联/ 修改 Git 远程仓库地址
  17. How To Install GLPI 9.5 On CentOS7
  18. 脚本批量执行Redis命令
  19. bzoj 4455 [Zjoi2016]小星星 树形dp容斥
  20. jacob操作office word简单教程

热门文章

  1. python爬取地图地址_Python爬取百度地图poi数据 !
  2. 058_《突破Delphi7.0编程实例五十讲》
  3. python3合并多个docx文件
  4. 3.使用GSYVideoPlayer实现仿抖音视频播放以及点赞飘心效果
  5. 国庆不加班攻略丨7款效率神器速领(内附福利)
  6. 怎么彻底卸载matlab_怎么彻底清理手机卸载残留文件,这个方法简单一步到位
  7. c语言写考勤系统,C语言课程设计学生考勤系统
  8. Appium-Screenshot(截图)
  9. 中国汽车仪表玻璃市场运行分析与投资前景预测报告2022-2028年
  10. 计算机系统结构中的8个伟大思想