您的位置:首页 > 其它

AFNetWorking 获取statusCode

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

2.0的方法,具体不多说了

operation.response.statusCode == 500

3.0正常获取的方法:

+ (AFHTTPSessionManager *)manager
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = kTimeOutInterval;
manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上传JSON格式

// 声明获取到的数据格式
manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN会JSON解析返回的数据
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:TOKEN forHTTPHeaderField:@"Authorization"];

return manager;
}

//post
+ (void)httpPostRequest:(NSString *)url  Parameters:(NSDictionary *)params WithSuccess:(void (^)(id result))success failure:(void (^)(NSError *error))failure statusCode:(void (^)(NSInteger statusCode))statusCode
{
AFHTTPSessionManager *manager = [self manager];
[manager POST:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
/*注意:这里要强转下*/
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
statusCode(responses.statusCode);
NSLog(@"1111111111111111:%ld",    responses.statusCode );

success(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
}




用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同理)
+ (void)httpRequest:(NSString *)url
RequestType:(NSString *)type
Header:(NSDictionary *)headers
Parameters:(NSDictionary *)params
WithSuccess:(void (^)(id result))success
failure:(void (^)(NSError *error))failure
statusCode:(void (^)(NSInteger statusCode))statusCode{
AFHTTPSessionManager *manager = [self manager];

for (NSString *key in [headers allKeys]) {
[manager.requestSerializer setValue:[headers valueForKey:key] forHTTPHeaderField:key];
}
NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:type URLString:url parameters:params error:nil];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
NSHTTPURLResponse * responses = (NSHTTPURLResponse *)response;
statusCode(responses.statusCode);
if (success) {
success(responseObject);
}
if (failure) {
failure(error);
}
}];
[dataTask resume];
}


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

/* 使用NSURLSessionUploadTask上传文件 */
- (void)uploadFile:(id)sender {
NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSData *data ;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//.......
}];
[uploadTask resume];
}


第三种Download Task用于完成下载文件的任务,使用全局的shared session和downloadTaskWithRequest:completionHandler:方法创建。

注意:在下载任务完成后,下载的文件位于tmp目录下,由代码块中的location指定(不妨输出看看),我们必须要在completion handler中将文件放到持久化的目录下保存。
/* 使用NSURLSessionDownloadTask下载文件 */
- (void)downloadFile:(id)sender {
 NSURL *URL = [NSURL URLWithString:@"图片的地址.jpg"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request                                                            completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
 [self showResponseCode:response];
// 输出下载文件原来的存放目录
NSLog(@"%@", location);
 // 设置文件的存放目标路径
NSString *documentsPath = [self getDocumentsPath];
NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:[[response URL] lastPathComponent]];
// 如果该路径下文件已经存在,就要先将其移除,在移动文件
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:[fileURL path] isDirectory:NULL]) {
[fileManager removeItemAtURL:fileURL error:NULL];
}
[fileManager moveItemAtURL:location toURL:fileURL error:NULL];
// 在webView中加载图片文件
NSURLRequest *showImage_request = [NSURLRequest requestWithURL:fileURL];
[self.webView loadRequest:showImage_request];
[self.spinner stopAnimating];
}];
    [downloadTask resume];  
}     
/* 获取Documents文件夹的路径 */  
- (NSString *)getDocumentsPath {  
    NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSString *documentsPath = documents[0];  
    return documentsPath;  
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: