NSUrlConnection -> NSUrlSession;不再返回 NSError for complete处理程序错误



我有一些长期的常规代码,这些代码已使用nsurlconnection提出异步请求,以及一个完整的手块来处理它。不久前,我转到了Nsurlsession的一些小额外功能,但主要认为它们在实施方面相似。他们俩都以同样的方式将我的完整汉格勒块带走,并在完成后将其称为。设置有些不同。

最近,我发现一个令人不安的问题,即当真正发生错误时,Nsurlsession并没有将NSERROR返回完成。用例适用于HTTP 401 AUTH问题,通常带有NSERROR代码-1012。对于nsurlsession,nserror为零。

无论我是否使用代表,这都是正确的。而且didfailwitherror委托也没有返回。

为什么nsurlsession不会返回此错误?

void (^connectionCompletionHandlerBlock)(NSData *data, NSURLResponse *response, NSError *error) = ^(NSData *data, NSURLResponse *response, NSError *error){
   if(error){
      // handle error
      if(error.code == -1012){  // such as http 401 login error
         // auth error
      }
   } else {
      // no error
   }
}
NSString *url = @"http://blahblah.com";
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
// configure urlRequest with params, etc

nsurlconnection方式:( nserror -1012返回401错误)

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:connectionCompletionHandlerBlock];

nsurlsession方法:(无nserror -1012返回401错误)

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];
NSURLSessionDataTask *task = [session dataTaskWithRequest:urlRequest completionHandler:connectionCompletionHandlerBlock];
[task resume];

我期望获得401的nserror:

错误域= nsurlorrordomain代码= -1012"(null)" userInfo = {nserrorfailingurlstringkey = https://api/api/blah,nsunderlyingerror = 0x6600004047890 LerrorauthfailedResponsekey= {url = https://api/blah}}}}},nserrorfailingurkey = https://api/blah}

在进行了一些研究后发现。nsurlsession不会通过设计返回服务器端错误。

来自Nsurlsession Apple文档

注意:nsurlsession不会通过错误报告服务器错误范围。您的应用程序通过错误收到的唯一错误参数是客户端错误,例如无法解析主机名或连接到主机。

通过NSHTPURLRESPONSE对象中的HTTP状态代码。更多信息,阅读nshttpurlresponse的文档和nsurlresponse类。

相关内容

最新更新