如何测试sendAsynchronousRequest的部分响应:queue:completionHandler:?

时间:2013-04-24 12:05:02

标签: iphone objective-c nsurlconnection

我有以下代码:

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 *响应 - 但无法弄清楚如何使用它(或者,如果它在这种情况下确实有用)。关于如何测试块返回的“部分接收”数据的任何想法?

1 个答案:

答案 0 :(得分:1)

此查询可能有两种不同的故障模式未处理,您需要单独检查它们:

  • “成功”HTTP连接,但回复格式错误
  • “成功”HTTP连接,但状态代码表示服务器上存在问题

对于NSURLConnectionerror仅在连接失败时设置,而不是在服务器报告问题时设置(例如:404错误或{ {1}}回复)。

通常,当您与330HTTP服务通话时,您需要检查HTTPS中的-statusCode,如果是NSURLResponse服务实际上是NSHTTPURLResponse。如果服务器上出现错误,例如408请求在服务器上超时,则需要单独处理连接失败(这将导致error设置)。

即使您找回了一个不错的[response statusCode] == 200,您仍可能需要检查格式错误的响应,在解析返回的数据时,您需要执行此操作。这是一个不太可能的情况,但如果服务器是flakey,您可能会得到部分响应或编码失败。