我在我的iOS应用程序中使用ASIHTTPRequest lib来向我的Rails 3 Web应用程序发出RESTful请求。我第一次尝试向我的Web应用程序发出POST请求时看到一个奇怪且有些一致的错误,但是POST请求在第二次尝试时正常工作。确切的错误是......
Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xb513740 {NSUnderlyingError=0xb5135a0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1005.)", NSLocalizedDescription=A connection failure occurred}
这是我的ASIHTTPRequest代码,用于发出POST请求......
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://myrails3app.heroku.com/tournaments/%d/register.json", tid]];
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request addPostValue:username forKey:@"username"];
[request setCompletionBlock:^
{
NSData *responseData = [request responseData];
NSLog(@"Success!");
}];
// Set the code to be called when the request fails
[request setFailedBlock:^
{
NSError *error = [request error];
NSLog(@"Error: %@", [error localizedDescription]);
}];
// Start the request
[request startAsynchronous];
值得一提的是,当它出错时,它会错误地快速出错!另外,对于它的价值,我正在发出POST请求的我的Rail 3应用程序是在Heroku上托管的。你的想法?
非常感谢你的智慧!
答案 0 :(得分:30)
这个问题我很难弄明白为什么。问题在于ASIHTTPRequest本身(iOS),而不是rails代码。
简而言之,问题是针对 ASIHTTPRequest发送的每个请求使用持久连接。
虽然这对GET请求有好处,但大多数服务器实现都不允许将持久连接与POST请求一起使用。
我没有时间在服务器方面深入调查它,但我认为问题在于应该发送的100-Continue标头(哪些不是)与附加了主体的请求它(因此PUT / POST)。如果您想更深入地了解我正在谈论的内容,请阅读规格表:http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
因此,ASIHTTPRequest使用的持久连接等待发送100响应,永远不会发送。所以它最终会超时。
修复方法是使用以下发布请求将persistentConnection设置为NO:
ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url];
req.shouldAttemptPersistentConnection = NO;
答案 1 :(得分:1)
安全连接失败
An error occurred during a connection to login.yahoo.com.
SSL收到的邮件验证码不正确。
(错误代码:ssl_error_bad_mac_read)
您尝试查看的页面无法显示,因为无法验证接收数据的真实性。 请与网站所有者联系,告知他们这个问题。或者,使用帮助菜单中的命令报告此损坏的站点。
答案 2 :(得分:0)
在iOS 5.1上,即使将ASIHTTPRequest
升级为ASIHTTPRequestVersion
= @“v1.8.1-61 2011-09-19”仍然需要:
ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url];
req.shouldAttemptPersistentConnection = NO;
答案 3 :(得分:0)
我还必须通过Java servlet
将响应setHeader连接设置为“close”response.setHeader("Connection", "close");