- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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/
我看到很多人发布关于 NullInjectorError: No provider for HttpClient! 的问题但是我在 Karma 单元测试中遇到了更具描述性的错误。我一直在学习 Angu
全部, 我创造: public static final HttpClient DEFAULT_HTTPCLIENT = HttpClients .createDefault(); f
我正在使用 HttpClient fluent api 编写验收测试,但遇到了一些麻烦。 @When("^I submit delivery address and delivery time$")
有人可以分享如何配置现代 HttpClient 4.5.3 以重试失败的请求并在每次重试前等待一段时间吗? 到目前为止,我似乎正确理解了 .setRetryHandler(new DefaultHtt
我在使用 java 中的 HttpClient 库时遇到问题。 目标网站在 SSL ( https://www.betcris.com ) 上,我可以从该网站加载索引页面就好了。 但是,显示不同运动赔
所以我的应用涉及大量网络调用(可能连接到 10 个不同的服务器)和获取数据。从我读过的几篇文章中,建议重用 HTTPClient 实例,因为它可以防止资源(套接字等)的浪费。但是我发现围绕可扩展且健壮
我正在调用一个外部 API,并希望我的 API 可以进行单元测试。为此,我正在尝试包装 HttpClient。我现在只需要一种方法。 这是我的界面。 public interface IHttpCli
出于调试目的,我希望看到将要发送的原始请求。有没有一种方法可以直接从 HttpPost 或 HttpClient 的API中获得没有HTTP监视器的信息? 我发现了一些“几乎”重复的问题,但不是针对这
我正在尝试在小型 WebAssemply 应用程序(使用 .NET 5 创建)中测试 HttpClient。program.cs 包含以下语句来添加 HttpClient 服务: builder.Se
我在 Application_Start 事件中创建了 HttpClient 的单个实例,以便在 Global.asax.cs 中的应用程序中重用 应用程序启动中的代码: protected
我对此有点新手...基本上我需要运行一个脚本来从谷歌趋势下载.csv 文件。我按照这个reference写了下面的代码,代码如下: HttpClient client = new Defau
我正在尝试实现一个基本的 1 spout - 1 bolt Storm 拓扑。我有一个 Storm Bolt,可以使用 Apache HttpClient (4.3.1) 发出 HTTP 请求。但是,
我正在尝试在我的 Xamarin.Forms 移动应用程序中使用 HttpClient 创建网络服务层。 没有单例模式 单例模式 在第一种方法中,我在每个新请求中创建新的 http 客户端对象通过移动
在下面的示例中,我创建了一个 Java 11 httpClient,然后创建了多个并发 HttpRequest。 这是不好的做法吗? 每个 HttpRequest 都应该有自己的 HttpClient
我正在开发一个 Drupal 8 自定义模块。我在任何节点类型中都有两个字段(url 和文本 html 字段)。这是该模块所期望的功能: 该模块将抓取“url字段”的页面并复制html代码以将它们粘贴
我正在为 httpclient 使用 apache httpcompnonents 库。我想在多线程应用程序中使用它,其中线程数会非常高,并且会有频繁的 http 调用。这是我用来在执行调用后读取响应
最近我将我的代码库从 .net core 1.0 迁移到 2.0 。之后,我随机收到错误 “使用 System.Net.Http.HttpClient 时服务器返回无效或无法识别的响应错误”。我在 1
我有该代码: while(!lastPage && currentPage < maxPageSize){ StringBuilder request = new Strin
我的应用程序使用 Apache HTTPClient 4.3.5 发送 HTTP 请求并获得响应。 我想弄清楚应用程序收到了什么响应。 以下是日志片段- [Jan 04 2015 05:38:14.1
如何从 HttpClient 类型的现有对象获取 cookie? 我正在使用 HttpClient 版本 4.3.3,它不再有方法 httpClient.getCookieStore() 了。 最佳答
我是一名优秀的程序员,十分优秀!