我有以下代码:
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://some-example-domain.com/api"]
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:30.0];
[NSURLConnection sendAsynchronousRequest:theRequest
queue: [NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (!error && data) {
// success!! - no errors and data returned
NSLog(@"success");
} else {
// error!! - something whent wrong
NSLog(@"failure: %@", [error localizedDescription]);
}
}
];
运行良好 - 除了,用于奇怪的情况,当服务器只发送部分所需的响应时(例如,来自API的JSON响应的一半)(根据我的说法,它仍然是“成功的”) 'if'声明)
有没有办法使用这种基于块的方法,我可以检查收到的数据是否完整?
我已经尝试过调查NSURLResponse *响应 - 但无法弄清楚如何使用它(或者,如果它在这种情况下确实有用)。关于如何测试块返回的“部分接收”数据的任何想法?
答案 0 :(得分:1)
此查询可能有两种不同的故障模式未处理,您需要单独检查它们:
对于NSURLConnection
,error
仅在连接失败时设置,而不是在服务器报告问题时设置(例如:404
错误或{ {1}}回复)。
通常,当您与330
或HTTP
服务通话时,您需要检查HTTPS
中的-statusCode
,如果是NSURLResponse
服务实际上是NSHTTPURLResponse
。如果服务器上出现错误,例如408
请求在服务器上超时,则需要单独处理连接失败(这将导致error
设置)。
即使您找回了一个不错的[response statusCode] == 200
,您仍可能需要检查格式错误的响应,在解析返回的数据时,您需要执行此操作。这是一个不太可能的情况,但如果服务器是flakey,您可能会得到部分响应或编码失败。