AFNetWorking 获取statusCode

来源:互联网 发布:淘宝模板是什么格式的 编辑:程序博客网 时间:2024/05/18 00:57

转自:http://blog.csdn.net/jyt199011302/article/details/54572940

最近做的项目中遇到这个问题,用3.0中的Session Task来获取这个问题困扰我好久,上周五找了好多资料终于解决了,着这里把问题记下:

2.0的方法,具体不多说了

[objc] view plain copy
 print?
  1. operation.response.statusCode == 500  

3.0正常获取的方法:

[objc] view plain copy
 print?
  1. <span style="font-size:14px;">+ (AFHTTPSessionManager *)manager  
  2. {  
  3.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  4.     manager.requestSerializer.timeoutInterval = kTimeOutInterval;  
  5.     manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上传JSON格式  
  6.       
  7.     // 声明获取到的数据格式  
  8.     manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN会JSON解析返回的数据  
  9.     [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];  
  10.     [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];  
  11.     [manager.requestSerializer setValue:TOKEN forHTTPHeaderField:@"Authorization"];  
  12.   
  13.     return manager;  
  14. }  
  15.   
  16. //post  
  17. + (void)httpPostRequest:(NSString *)url  Parameters:(NSDictionary *)params WithSuccess:(void (^)(id result))success failure:(void (^)(NSError *error))failure statusCode:(void (^)(NSInteger statusCode))statusCode  
  18. {  
  19.     AFHTTPSessionManager *manager = [self manager];  
  20.     [manager POST:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {  
  21.         /*注意:这里要强转下*/  
  22.         NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;  
  23.         statusCode(responses.statusCode);  
  24.         NSLog(@"1111111111111111:%ld",    responses.statusCode );  
  25.   
  26.         success(responseObject);  
  27.     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
  28.            if (failure) {  
  29.                failure(error);  
  30.            }  
  31.     }];  
  32. }  
  33. 
</span>  

Session Task获取:

Session Task分为三种Data Task,Upload Task,Download Task。毫无疑问,Session Task是整个NSURLSession架构的核心目标。

下面写了一个简单的Demo来初步使用下三种任务对象。这里使用的是convenience methods,并没有定制session和使用协议,都是采用completionHandler作为回调动作。

第一种Data Task用于加载数据,使用全局的shared session和dataTaskWithRequest:completionHandler:方法创建。

completionHandler指定任务完成后的动作。注意一定要使用resume方法启动任务。(Upload Task和Download Task同理)
[objc] view plain copy
 print?
  1. <span style="font-size:14px;">+ (void)httpRequest:(NSString *)url  
  2.         RequestType:(NSString *)type  
  3.              Header:(NSDictionary *)headers  
  4.          Parameters:(NSDictionary *)params  
  5.         WithSuccess:(void (^)(id result))success   
  6.             failure:(void (^)(NSError *error))failure  
  7.          statusCode:(void (^)(NSInteger statusCode))statusCode{  
  8.     AFHTTPSessionManager *manager = [self manager];  
  9.       
  10.     for (NSString *key in [headers allKeys]) {  
  11.         [manager.requestSerializer setValue:[headers valueForKey:key] forHTTPHeaderField:key];  
  12.     }  
  13.     NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:type URLString:url parameters:params error:nil];  
  14.       
  15.     NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {  
  16.         NSHTTPURLResponse * responses = (NSHTTPURLResponse *)response;  
  17.        statusCode(responses.statusCode);  
  18.         if (success) {  
  19.             success(responseObject);  
  20.         }  
  21.         if (failure) {  
  22.             failure(error);  
  23.         }  
  24.     }];  
  25.     [dataTask resume];</span>  
  26. }  

第二种Upload Task用于完成上传文件任务,使用方法类似:

[objc] view plain copy
 print?
  1. <span style="font-size:14px;">/* 使用NSURLSessionUploadTask上传文件 */  
  2. - (void)uploadFile:(id)sender {  
  3.     NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];  
  4.     NSURLRequest *request = [NSURLRequest requestWithURL:URL];  
  5.     NSData *data ;  
  6.     NSURLSession *session = [NSURLSession sharedSession];  
  7.     NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {  
  8.         //.......  
  9.     }];  
  10.     [uploadTask resume];  
  11. }</span>  

第三种Download Task用于完成下载文件的任务,使用全局的shared session和downloadTaskWithRequest:completionHandler:方法创建。
注意:在下载任务完成后,下载的文件位于tmp目录下,由代码块中的location指定(不妨输出看看),我们必须要在completion handler中将文件放到持久化的目录下保存。

[objc] view plain copy
 print?
  1. /* 使用NSURLSessionDownloadTask下载文件 */  
  2. - (void)downloadFile:(id)sender {  
  3.     NSURL *URL = [NSURL URLWithString:@"图片的地址.jpg"];  
  4.     NSURLRequest *request = [NSURLRequest requestWithURL:URL];  
  5.     NSURLSession *session = [NSURLSession sharedSession];  
  6.     NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request                                                                                                             completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {  
  7.            [self showResponseCode:response];  
  8.          // 输出下载文件原来的存放目录  
  9.           NSLog(@"%@", location);  
  10.          // 设置文件的存放目标路径  
  11.         NSString *documentsPath = [self getDocumentsPath];  
  12.         NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];  
  13.         NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:[[response URL] lastPathComponent]];  
  14.         // 如果该路径下文件已经存在,就要先将其移除,在移动文件  
  15.         NSFileManager *fileManager = [NSFileManager defaultManager];  
  16.         if ([fileManager fileExistsAtPath:[fileURL path] isDirectory:NULL]) {  
  17.             [fileManager removeItemAtURL:fileURL error:NULL];  
  18.          }  
  19.         [fileManager moveItemAtURL:location toURL:fileURL error:NULL];  
  20.          // 在webView中加载图片文件  
  21.         NSURLRequest *showImage_request = [NSURLRequest requestWithURL:fileURL];  
  22.         [self.webView loadRequest:showImage_request];  
  23.         [self.spinner stopAnimating];  
  24.         }];  
  25.         [downloadTask resume];    
  26. }         
  27. /* 获取Documents文件夹的路径 */    
  28. - (NSString *)getDocumentsPath {    
  29.         NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
  30.         NSString *documentsPath = documents[0];    
  31.         return documentsPath;