前几天服务器端的产品经理跑来问我是否有做请求超时和响应超时的处理。我一脸迷茫,直接就说:我做了开发这么久,从不知道什么是请求超时什么是响应超时。
后来我静下来仔细想想,确实应该有请求超时和响应超时这两个概念,不然会出很多问题的。
然后花了一些时间仔细查了下资料。确实是如此。
ConnectException : 指的是服务器请求超时
SocketTimeoutException:指的是服务器响应超时
可以在代码里设置
//请求超时
httpclient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,reqTimeout);
//响应超时
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, resTimeout);
大家如果以后做安全级别高的项目可能会碰到我这样的问题。我说明下。
当一笔交易,如果请求失败,那可以允许用户再次提交。
如果是响应失败,那就说明用户提交成功了,应该防止用户再次提交
方法实在是很简单, 为你的httpclient添加一个retry handler就ok了。代码如下:
- HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
- @Override
- public boolean retryRequest(IOException arg0, int arg1, HttpContext arg2) {
- // retry a max of 5 times
- if (arg1 >= 3) {
- return false;
- }
- if (arg0 instanceof ch.boye.httpclientandroidlib.NoHttpResponseException) {
- return true;
- } else if (arg0 instanceof ch.boye.httpclientandroidlib.client.ClientProtocolException) {
- return true;
- }
- return false;
- }
- };
- sHttpClient.setHttpRequestRetryHandler(retryHandler);
HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException arg0, int arg1, HttpContext arg2) {
// retry a max of 5 times
if (arg1 >= 3) {
return false;
}
if (arg0 instanceof ch.boye.httpclientandroidlib.NoHttpResponseException) {
return true;
} else if (arg0 instanceof ch.boye.httpclientandroidlib.client.ClientProtocolException) {
return true;
}
return false;
}
};
sHttpClient.setHttpRequestRetryHandler(retryHandler);
如果上面的代码不好使的话,可以试着添加:
HttpProtocolParams.setUseExpectContinue(params, false);
http://www.cnblogs.com/codingmyworld/archive/2011/08/17/2141706.html