org.apache.http.client.ClientProtocolException解决方案

原创 2013年12月04日 09:21:56
先描述一下需求:我为了保证服务端的session超时问题,然后做了一个timetask的轮询,每20分钟调用一次服务端。其中String url = new PropertyUtil(this).getUrlBase();是我们web端的首页,我随便调用了一下只是为了保证sessin的问题。
连接的第一次是正常返回,然后剩下的每次都报这样的错:
12-03 18:07:09.470: W/System.err(5047): org.apache.http.client.ClientProtocolException
12-03 18:07:09.470: W/System.err(5047):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557)
12-03 18:07:09.470: W/System.err(5047):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-03 18:07:09.470: W/System.err(5047):         at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:74)
12-03 18:07:09.470: W/System.err(5047):         at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:91)
12-03 18:07:09.470: W/System.err(5047):         at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:54)
12-03 18:07:09.470: W/System.err(5047):         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
12-03 18:07:09.470: W/System.err(5047):         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-03 18:07:09.470: W/System.err(5047):         at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-03 18:07:09.470: W/System.err(5047):         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-03 18:07:09.470: W/System.err(5047):         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-03 18:07:09.470: W/System.err(5047):         at java.lang.Thread.run(Thread.java:856)
12-03 18:07:09.470: W/System.err(5047): Caused by: org.apache.http.client.CircularRedirectException: Circular redirect to 'http://192.168.1.110:8080/task/'
12-03 18:07:09.470: W/System.err(5047):         at org.apache.http.impl.client.DefaultRedirectHandler.getLocationURI(DefaultRedirectHandler.java:173)
12-03 18:07:09.470: W/System.err(5047):         at org.apache.http.impl.client.DefaultRequestDirector.handleResponse(DefaultRequestDirector.java:923)
12-03 18:07:09.470: W/System.err(5047):         at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:475)
12-03 18:07:09.470: W/System.err(5047):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)

12-03 18:07:09.470: W/System.err(5047):         ... 10 more


package cn.timetask.service;
 
import java.net.URLEncoder;
 
import org.apache.http.Header;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.protocol.HTTP;
import org.json.JSONException;
import org.json.JSONObject;
 
import cn.timetask.app.App;
import cn.timetask.dict.ResultCode;
import cn.timetask.utils.AsyncHttpCilentUtil;
import cn.timetask.utils.LogUtil;
import cn.timetask.utils.NetworkUtil;
import cn.timetask.utils.PropertyUtil;
import cn.timetask.utils.StringUtil;
 
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
 
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Base64;
import android.util.Log;
 
/**
 * 为保持web端session超时的问题 将采用20分钟访问一次服务端
 * 
 * @author linhui 2013-12-3上午9:56:11
 */
public class KeepWebSessionService extends Service {
        public static final String TAG = "KeepWebSession";
        public static final String ACTION = "cn.timetask.service.KeepWebSessionService";
 
        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
 
        @Override
        public void onCreate() {
        }
 
        @Override
        public void onStart(Intent intent, int startId) {
                LogUtil.d(TAG, "===keep service start===");
                new Thread() {
                        public void run() {
                                keepWebSession();
                        };
                }.start();
        }
 
        public void keepWebSession() {
                // 非ui线程
                AsyncHttpClient client = AsyncHttpCilentUtil.getInstence();
                RequestParams rparams = new RequestParams();
                String url = new PropertyUtil(this).getUrlBase();
                client.setBasicAuth(App.getInstance().getUserCode(), App.getInstance()
                                .getPassword());
                rparams.put(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, false);
                client.setUserAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;.NET CLR 1.1.4322; CIBA; .NET CLR 2.0.50727)");
                client.post(url, rparams, new AsyncHttpResponseHandler() {
                        @Override
                        public void onSuccess(String response) {
                                try {
                                        LogUtil.d("success response", response);
                                        JSONObject jsonObj = new JSONObject(response);
                                        if (StringUtil.notEmpty(jsonObj)) {
                                                LogUtil.d(TAG, "=====keep web session=====" + response);
                                        }
                                } catch (JSONException e) {
                                        LogUtil.e(TAG, e + "");
                                        e.printStackTrace();
                                }
                        }
 
                        @Override
                        public void onStart() {
                                super.onStart();
                                LogUtil.e(TAG, "onStart");
                        }
 
                        @Override
                        public void onFinish() {
                                super.onFinish();
                                LogUtil.e(TAG, "onFinish");
                        }
 
                        @Override
                        public void onFailure(int arg0, Header[] arg1, byte[] arg2,
                                        Throwable arg3) {
                                super.onFailure(arg0, arg1, arg2, arg3);
                                LogUtil.e(TAG, "onFailure");
                                LogUtil.d("arg0", arg0 + "");
                                LogUtil.d("arg3", arg3 + "");
                        }
                });
 
        }
 
        @Override
        public void onDestroy() {
                super.onDestroy();
                LogUtil.d(TAG, "===keep service onDestroy===");
 
        }
 
}

解决方法:

这个是因为重定向引起的,然后我在加了一个接口,专门用来返回一个json即可。

你可以在服务端返回retur null,或者返回一个json等,只要别重定向就行。

还有一个问题就是,当你报了一次500,或者timetou后,会出现重定向的问题,我怀疑这是location和自己本事的utl冲突导致的,具体的资料我还没有找到,请记得加上下面这句,以免在服务端session超时后,再次调用导致重定向的问题

AsyncHttpClient client = AsyncHttpCilentUtil.getInstence();
client.getHttpClient().getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);


版权声明:本文为博主原创文章,未经博主允许不得转载。

java 使用httpclient出错org.apache.http.client.ClientProtocolException

解决Caused by: org.apache.http.HttpException: Unable to establish route:。。。。。。
  • u012286804
  • u012286804
  • 2015年02月06日 15:17
  • 4527

httpclient请求时遇到org.apache.http.client.ClientProtocolException

看过网上的解决方法,后来在一个CSDN博客中找到了答案,下面是我的解决方法 client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_R...
  • acuna1
  • acuna1
  • 2012年10月12日 06:52
  • 59997

淘淘商城异常:org.apache.http.client.ClientProtocolException

在做淘淘商城商品详细信息展示功能时,调用rest工程发布的展示商品详情的时候报错如下: 发现是用httpClient调用rest发布的服务时,没有正确注入到实现类中调用服务的url。...
  • zlj1217
  • zlj1217
  • 2017年05月07日 15:58
  • 331

Apache HttpClient 实现 Java 调用 Http 接口

Apache HttpClient 实现 Java 调用 Http 接口
  • Silent_Paladin
  • Silent_Paladin
  • 2017年03月11日 20:36
  • 2216

使用httpClient访问指定网址

对于httpClient4.3访问指定页面,可以从下面的demo抽取方法使用。 注意:对于URL必须使用 http://开始,否则会有如下报错信息: Caused by: org.apache.h...
  • seven_zhao
  • seven_zhao
  • 2015年01月20日 10:55
  • 13504

HttpClient使用详解

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且...
  • wangpeng047
  • wangpeng047
  • 2014年02月28日 11:04
  • 725173

httpclient请求时遇到org.apache.http.client.ClientProtocolException

看过网上的解决方法,后来在一个CSDN博客中找到了答案,下面是我的解决方法 client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_R...
  • u013036792
  • u013036792
  • 2014年11月05日 13:30
  • 1176

org.apache.http.client.httpclient4.1.3 超时处理

httpclient是很好的http连接工具包。(请注意,这里的httpclient不是apache-commons的httpclient,两者千万不要弄混了) import static or...
  • u010802573
  • u010802573
  • 2014年01月26日 10:32
  • 1901

Apache HttpClient使用详解

转载地址:http://eksliang.iteye.com/blog/2191017 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConne...
  • u013473691
  • u013473691
  • 2016年08月24日 10:04
  • 3499

Android客户端http请求使用的InputStreamEntity抛出异常ClientProtocolException解决办法

参考http://blog.csdn.net/wudiwo/article/details/9339445 上文中描述的 1.1.7 生成实体内容 HttpClient提供一些类,它们可以用...
  • xiaoxiaoxixi465trr
  • xiaoxiaoxixi465trr
  • 2016年06月17日 17:46
  • 972
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:org.apache.http.client.ClientProtocolException解决方案
举报原因:
原因补充:

(最多只允许输入30个字)