AsyncHttpClient 中的重定向和 setEnableRedirects 方法异常解决
来源:互联网 发布:smaat7软件下载 编辑:程序博客网 时间:2024/06/06 08:20
今天使用 AsyncHttpClient 开源库,遇到个很崩溃的问题:
方法 setEnableRedirects(false); 从名称上看应该是重定向开关的方法,设置为 false 后则普通请求正常,但是遇到重定向则停止请求,还算正常(文章末尾会谈到这里会遇到另一个 BUG 的情况)
但当设置为 setEnableRedirects(true); 按理说应该是对于 301、302 重定向将进行跟随重定向进行请求的,但却出现各种异常和乱七八糟的问题,不论是普通请求还是重定向的请求全是 ClientProtocolException、 CircularRedirectException 等异常,有时还不停的 GC
类似:
各种调试,弄了大半天才终于搞定是怎么回事!
我觉得 AsyncHttpClient 开源库中的源码 setEnableRedirects 方法有问题,看了下源码:
/** * Simple interface method, to enable or disable redirects. If you set manually RedirectHandler * on underlying HttpClient, effects of this method will be canceled. * * @param enableRedirects boolean */ public void setEnableRedirects(final boolean enableRedirects) { httpClient.setRedirectHandler(new DefaultRedirectHandler() { @Override public boolean isRedirectRequested(HttpResponse response, HttpContext context) { return enableRedirects; } }); }
似乎设置为 setEnableRedirects 为 true 后,所有请求包括 http 200 都会 isRedirectRequested 方法都会返回 true 标记为重定向导致所有请求全部都出现问题,
于是新建个类继承 AsyncHttpClient 后重写了他的 setEnableRedirects 方法,只对 301和 302进行重定向返回设置的 boolean 值,这下测试就 ok 了,普通请求正常,重定向则自动重定向请求到数据了,跟预想的结果一样了:
修改后的代码:
@Override public void setEnableRedirects(final boolean enableRedirects) { ((DefaultHttpClient) getHttpClient()).setRedirectHandler(new DefaultRedirectHandler() { @Override public boolean isRedirectRequested(HttpResponse response, HttpContext context) { int statusCode = response.getStatusLine().getStatusCode(); ZLog.i("setEnableRedirects", "code:"+ statusCode); if (statusCode == 301 || statusCode == 302) { ZLog.i("setEnableRedirects", "enableRedirects: true"); return enableRedirects; } return false; } }); }
这样当 设置为 false 时则全部状态都返回 false,设置为true 时则仅对 301、302 才返回 true,其余都返回 false
同时还要配置下面的参数设置:
getHttpClient().getParams().setParameter(ClientPNames.MAX_REDIRECTS, 3); getHttpClient().getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);
允许环形重定向和设置重定向最大次数。
AsyncHttpClient 中的重定向和 setEnableRedirects 方法异常解决
下面还有个重要提示:
经过我多次的测试实验,发现:
其实系统默认应该是允许请求重定向的,但这里有个 BUG,就是如果你有两个请求是相同的链接地址,则只有第一个请求会被重定向,第二个则不会,将直接出现最上面的那一堆堆的异常信息。
解决办法:
很简单,就是上面提到的 环形重定向的参数设置了,加上就好了。
这里还要强调一点就是如果你不复写 setEnableRedirects 方法的话,那么最好千万不要调用他,一旦调用他就会重置 handle 导致出现前面说到的各种问题,
仅在需要禁止重定向的时候调用该方法设置为 false
血泪教训啊,浪费了一天的青春,感叹下其实很多技术博客里的文章,并不是你看到的简简单单的一个个字符,背后都是无数程序猿们的血泪和无悔青春,用生命的代价换来的。
- AsyncHttpClient 中的重定向和 setEnableRedirects 方法异常解决
- Android http 请求——AsyncHttpClient集成【解决重定向问题、setEnableRedirects 方法异常、线程中调用异常问题】
- glib中的log输出重定向方法
- Servlet中的重定向sendredirect方法
- Servlet中的重定向和请求分派
- python和bash中的IO重定向
- servlet(jsp)中的重定向和转发
- java web中的转发和重定向
- action中的重定向和转发
- linux 重定向中的 &> 和 >的作用
- Http中的重定向和转发
- j2ee中的重定向和转发
- servlet中的跳转和重定向
- Servlet中的跳转和重定向
- 重定向和转发中的路径问题
- SpringMVC中的转发和重定向
- Bash和Ksh中的重定向
- SpringMvc中的转发和重定向
- CentOS Linux解决Device eth0 does not seem to be present
- iOS系类教程之用instruments来检验你的app
- NEUOJ 1040 Count (快速幂求第 n 个斐波那契数)
- SQL SERVER 语句大全
- 主成分分析(PCA)的来龙去脉
- AsyncHttpClient 中的重定向和 setEnableRedirects 方法异常解决
- telecom dict
- Android通过tcpdump抓包
- 题目1195:最长&最短文本
- ffmpeg音频编码示例
- 查看MATLAB自带函数的源代码
- 常用的几个提高iOS开发效率的开源类库及工具
- ACM 蓝桥之旅:取球游戏
- msdn ril windows mobile