1

次のコードがあります。

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 *response を調べてみましたが、その使用方法がよくわかりません (または、このシナリオで実際に役立つかどうか)。ブロックによって返された「部分的に受信された」データをテストする方法についてのアイデアはありますか?

4

1 に答える 1

1

このクエリには、処理されない 2 つの異なる失敗モードが潜在的にあり、それらを個別に確認する必要があります。

  • 「成功した」HTTP 接続ですが、不正な形式の応答です
  • 「成功」した HTTP 接続ですが、ステータス コードはサーバーの問題を示しています

の場合、NSURLConnectionerror接続が失敗した場合にのみ設定され、サーバーから問題が報告された場合 (404エラーや330応答など) には設定されません。

通常、HTTPまたはサービスと話しているときは、でHTTPSをチェックする必要があります。これらのサービスの場合、実際にはです。サーバーでリクエストがタイムアウトしたなどのエラーがサーバーにある場合は、接続障害とは別に処理する必要があります (これにより が設定されます)。-statusCodeNSURLResponseNSHTTPURLResponse408error

nice が返されたとしても、返さ[response statusCode] == 200れたデータを解析するときに、不正な形式の応答を確認する必要があります。これは可能性が低いシナリオですが、サーバーが不安定な場合、部分的な応答またはエンコードの失敗が発生する可能性があります。

于 2013-04-24T13:51:54.717 に答える