我有一些长期的常规代码,这些代码已使用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类。