iOS开发:为什么我总是在第一次尝试时发生“连接失败”,但下一次成功?

时间:2011-05-21 14:47:21

标签: iphone ruby-on-rails ios ipad asihttprequest

我在我的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上托管的。你的想法?

非常感谢你的智慧!

4 个答案:

答案 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");