【发布时间】:2012-04-15 17:41:17
【问题描述】:
我现在正在尝试将某些服务器 API 调用从 http 切换到 https,但我遇到了一个我无法向自己解释的问题。
从 http 切换到 https 后,我发现我的异步请求需要 60 秒才能完成,尽管服务器已经处理了请求。
没有抛出错误,没有发生超时或类似的事情,似乎需要整整 60 秒才能注意到请求已完成。然后,在 60 秒后,它就按照它的意图去做了。
这就是我正在做的:
NSString *theBody = @"param1=value1¶m2=value2";
NSData *bodyData = [theBody dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSURL *url = [NSURL URLWithString:@"https://my.api.server.com/call"];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease];
[request setValue:@"My User-Agent" forHTTPHeaderField:@"User-Agent"];
// Tested this one, too. Yes, I did set to utf8 encoding when trying this
// [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:bodyData];
// testing only
// [request setTimeoutInterval:15];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSLog(@"Finished!");
}];
60 秒后抛出日志消息。在输出日志消息之前刷新相应的数据时,我可以看到一切都已经发生了——我可以正确拉取刷新的数据。
我已经认为是我的服务器响应时间过长,但我已经尝试使用 Ruby 作为快速测试运行相同的请求并且它工作正常。
有人知道这里会发生什么吗?
提前致谢
阿恩
【问题讨论】:
-
当您发布到另一台服务器时会发生什么?只是为了测试?在 https 上发布到谷歌……我猜你的服务器有故障
-
你可能是对的。但是有一个有趣的事实:当请求不成功时,它会起作用。好吧,至少它不需要 60 秒,而是立即返回。我在我的服务器上返回一个 JSON 响应。如果调用成功,它会返回代码 201(实体创建成功)和对象的 JSON。如果不成功,则返回代码 4xx 和带有错误消息的 JSON。错误立即生效,成功需要 NSURLConnection 60 秒才能完成 - 但在此持续时间后它会正确完成。
-
我刚刚尝试再次使用委托而不是块,现在我得到了这个工作。但这怎么可能呢? 201 不被识别为响应代码是 iOS 5.1 中的错误吗?无法解释……有什么想法吗?
-
Aaand 整个事情又回来了。它不工作。正在调用 didReceiveData,但 didFinishLoading 需要 60 秒才能完成。我会用新数据更新我的帖子。
标签: objective-c ios https nsurlconnection nsurlrequest