gpt4 book ai didi

android - 来自 HttpClient 的重复请求

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:43 24 4
gpt4 key购买 nike

我在 android 上使用 HttpClient 4.0.1...我发出一个 POST 请求, header 集是当前毫秒...我看到该请求在几毫秒 (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;
}

最佳答案

所以这里似乎发生的情况是您的客户端发送了一个请求,没有及时得到响应,结果再次重试相同的请求(这是应该的)。反过来,这会导致多个 POST 请求被发送到您的服务器(几乎是连续的),您的服务器目前无法正确处理这些请求。

要验证/调试它,请尝试禁用 HTTP 重试,如下所示:

defaultHttpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler
(0, false));

这当然会解决您的重复请求问题,但随后会引入另一个更严重的问题;也就是说,它会尝试一次(并且只尝试一次)并失败。根据我从您的评论中获得的信息,这里有一些您可以尝试的想法:

请公开伪代码,因为我不了解您的客户端架构的所有细节

连续处理多个 POST

  • 禁用自动重试(如上所述)
  • 将您的POST 请求包装在类似于this 的循环中实现
  • 然后在您的手动 重试之间休眠 或实现您的exponential backoff 版本

无论如何,您的服务器需要以合理的方式处理重复请求的能力,毕竟这是 HTTP。但是,您至少让它有机会在第一个被重复轰炸之前处理它。

我建议处理请求时采取的第一步是设置某种形式的(重复)标志。然后,如果/当它收到欺骗时,它会继续处理第一个请求(像往常一样)并默默地忽略欺骗。

总结一下,整个方案的目的是让您的服务器有机会设置欺骗标志。之后,根据需要丢弃(或处理)重复请求是您的服务器的工作。这一切都有意义吗?

关于android - 来自 HttpClient 的重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8949487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com