【发布时间】:2012-01-21 00:06:05
【问题描述】:
我在 android 上使用 HttpClient 4.0.1...我发出一个带有当前毫秒的标头集的 POST 请求...我看到该请求在几毫秒 (5-10) 内两次命中服务器彼此..但是我为两个请求设置的标头是相同的。这种情况很少发生......我看不出wireshark中的请求之间没有真正的区别......我只是不知道这是怎么发生的。之前有人遇到过这个问题,或者对如何进一步调试有任何提示吗?
这是我用来创建客户端的代码:
public static HttpClient getAndroidHttpClient(final int timeOut) {
// set up the schemas
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));
// set up our params
HttpParams params = new BasicHttpParams();
params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeOut);
params.setIntParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, timeOut);
params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeOut);
params.setLongParameter(ConnManagerPNames.TIMEOUT, timeOut);
params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 1);
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(1));
params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
HttpProtocolParams.setUserAgent(params, "android-client-v1.0");
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "utf8");
ThreadSafeClientConnManager conman = new ThreadSafeClientConnManager(params, schemeRegistry);
DefaultHttpClient defaultHttpClient = new DefaultHttpClient(conman, params);
return defaultHttpClient;
}
【问题讨论】:
-
也许它来自 SchemeRegistry ?也许看看stackoverflow.com/a/1343130/320180
-
如果禁用重试(即
DefaultHttpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false))),还会出现这种情况吗? -
Marvin,这似乎是问题所在...如果您想要赏金,请添加答案。不幸的是,现在我遇到了这个问题:stackoverflow.com/questions/2052299/… 这是有问题的,因为再次发送相同的请求会导致服务器上出现奇怪的行为,这是我首先试图解决的问题......
-
@danb 会做的 - 给我一点做更多的研究和写下来。
-
@danb 我看到你对other 帖子回复的评论:“服务器收到第一个请求并更改了一些状态.. 再次发送相同的请求真的很麻烦”。此时调整服务器如何处理重复请求是否可行?我在想:当它收到重复的请求(即时间戳定义的重复)时,以您 最初 的响应方式进行响应。您能否概述一下它是如何工作的,以便我更好地了解?
标签: android httpclient