2

サーバーへの接続に使用-[NSURLConnection initWithRequest...]していますが、サーバー側で障害が発生すると、本文にメッセージが含まれるエラー 400 が返されます。エラーがない場合は、didReceiveData で応答データを取得できます。しかし、サーバーがエラー 400 を返すと、didReceiveData にエラー メッセージが表示されません。

ただし-[NSURLConnection sendSynchronousRequest...]、同じリクエストを使用すると、sendSynchronousRequestの戻り値からエラー データが取得されます。

didReceiveData からエラー メッセージを取得したいのですが、取得できない理由がわかりません。do の違いは何ですか、誰か助けてくれますか?

このようにして、エラーメッセージを取得できます。

NSURL *url = [NSURL URLWithString:@"http://devapi.xxx.com/v1/debug/error"];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url
                                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                          timeoutInterval:240] autorelease];

[request setHTTPMethod:@"POST"];


[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request
                                     returningResponse:&response
                                                 error:&error];


NSLog(@"STATUS:%d", [((NSHTTPURLResponse *)response) statusCode]);
NSLog(@"ERROR:%@", error);

この方法では取得できません:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://devapi.xxx.com/v1/debug/error"]
                                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                         timeoutInterval:240] autorelease];

[request setHTTPMethod:@"POST"];


[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
urlConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"statusCode:%d",((NSHTTPURLResponse *)response).statusCode);
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[receivedData appendData:data];
NSLog(@"DATA:%@",[NSString stringWithCString:[receivedData bytes] encoding:NSASCIIStringEncoding]);
}
4

2 に答える 2

1

このようなエラーを処理するには、このデリゲートメソッドを使用します。

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
      NSLog(@" Failed with error---%@",error);
}
于 2013-03-21T21:28:02.250 に答える
1

何が起こったのか分かったと思います. didReceiveResponse でエラーステータスコードを受け取ったとき, すぐにデータを取得して接続をキャンセルしようとしました. しかし, それは間違っています. didReceiveResponse の後に didReceiveData がまだ受信されているため.

どうもありがとう!

于 2013-03-22T02:12:20.930 に答える