我刚开始在iOs上使用ASIHTTPRequest,我遇到了一个小问题。所有请求都被发送两次到服务器,即使我只从库中获得一个回复给我的委托方法。
同步和异步请求都有此问题。我使用Xcode 4和ARC,但是通过添加-fno-objc-arc作为编译器标志来禁用ASIHTTPRequest。
任何想法都错了..?
代码:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
}
答案 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等工具收集网络跟踪,那么就可以准确地看到发生了什么。