AFNetWorking 获取statusCode
2017-01-16 14:18
134 查看
最近做的项目中遇到这个问题,用3.0中的Session Task来获取这个问题困扰我好久,上周五找了好多资料终于解决了,着这里把问题记下:
2.0的方法,具体不多说了
3.0正常获取的方法:
用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同理)
第二种Upload Task用于完成上传文件任务,使用方法类似:
第三种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;
}
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;
}
相关文章推荐
- AFNetWorking 获取statusCode
- AFNetworking 2.0获取响应头信息
- AFNetworking的请求头的cookie的值的获取和使用
- 使用 AFNetworking3.0请求时如何获取响应头文件
- ajax请求获取响应的StatusCode
- AFNetworking 2.0 获取json数据时,返回 NSLocalizedDescription=Request failed: unacceptable content-type: text/html, 解决方法.
- AFNetWorking获取状态码
- Afnetworking获取数据过程中MBProgressHUD提示,获取成功后MBProgressHUD消失。
- 在swift 中 使用AFNetworking获取json数据
- AFNetworking如何向服务器提交图片 ios中获取图片并上传图片
- AFNetworking获取服务端plist文件,XML文件
- 通过AFNetworking发送和获取网络资源
- Swift + AFNetworking获取天气信息
- AFNetWorking响应数据 如何获取键:值这种格式
- 通过AFNetworking下载网络闪屏用的图片并存储到本地同时获取header头相关信息
- 通过AFNetworking下载网络闪屏用的图片并存储到本地同时获取header头相关信息
- AFNetWorking获取errorData
- iOS使用AFNetWorking获取网络数据时遇到的问题??
- 使用AFNetWorking获取服务器数据
- AFNetworking如何获取完整的error body