ASIHTTPRequest,请求发送两次

时间:2011-11-29 21:00:15

标签: iphone ios http xcode4 asihttprequest

我刚开始在iOs上使用ASIHTTPRequest,我遇到了一个小问题。所有请求都被发送两次到服务器,即使我只从库中获得一个回复给我的委托方法。

同步和异步请求都有此问题。我使用Xcode 4和ARC,但是通过添加-fno-objc-arc作为编译器标志来禁用ASIHTTPRequest。

任何想法都错了..?

代码:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];

NSError *error = [request error];
if (!error) {
}

4 个答案:

答案 0 :(得分:15)

这也困扰了我。我正在使用GET请求来验证服务器上的多用途凭证代码。当我们为兑换代码添加了一个速率限制时,一些客户报告说它们应该达到限制之前。事实证明,一些验证引发了两次赎回。

您的请求正在使用GET方法。

使用GET时的默认行为是允许持久连接(the Keep-Alive HTTP header)。

当使用持久连接时,如果网络上的某些内容看起来很糟糕(这是技术术语)而不是请求失败,则可能会重新传输GET请求。这通常是可取的,因为GET请求通常不会对服务器产生任何副作用。

另一方面,POST或PUT请求默认不使用持久连接,也不会重新发送您的操作,这可能是购买信用卡或其他具有重大副作用的操作。

如果您希望阻止ASIHTTPRequest GET有时发送2个或更多服务器请求(由于您的控制范围之外的网络问题),您只需设置此标志:

request.shouldAttemptPersistentConnection = NO;

这应该处理服务器上的虚假GET重复项。

答案 1 :(得分:3)

感谢您的回复。我搬到了新的MKNetworkKit,从未回头看过ASIHttpRequest。 https://github.com/MugunthKumar/MKNetworkKit

奥伊斯坦

答案 2 :(得分:1)

它可能正在发送HEAD请求以获取响应大小,然后是GET请求以实际获取内容。有关详细信息,请参阅this section of the documentation

答案 3 :(得分:1)

可能是因为持久连接正在使用中,因此您在旧连接上看到失败的请求,然后在新连接上看到工作请求。 (GregInYEG也可以是HEAD请求。)

如果您使用wireshark或charlesproxy等工具收集网络跟踪,那么就可以准确地看到发生了什么。