iOS 【OC 封装网络请求业务类(AFHTTPSessionManager)】
来源:互联网 发布:分布式架构 java 编辑:程序博客网 时间:2024/06/07 07:17
由于AFNetworking底层请求由NSURLConnection更新为NSURLSession,管理者对象也由AFHTTPRequestOperationManager更新为AFURLSessionManager。
本文重点讲述如何封装AFN业务类,将第三方为程序带来的污染减小到最低。
读者可以结合老版本AFHTTPRequestOperationManager的封装去理解,具体请参考:
iOS 【network-封装业务类AFNetworking(AFHTTPRequestOperationManager 废弃)】
代码描述:
① 封装业务类
//// WZYAFNTool.h// 0716-02AFN上传下载GETPOST-01//// Created by 王中尧 on 16/7/16.// Copyright © 2016年 wzy. All rights reserved.//#import <Foundation/Foundation.h>@class AFNetWorking;@interface WZYAFNTool : NSObject+ (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;+ (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;+ (void)unload:(NSString *)uploadUrl parameters:(id)params filePath:(NSString *)filePath name:(NSString *)name progress:(void (^)(NSProgress *))progress success:(void (^)(id object))success failure:(void (^)(NSError *))failure;+ (void)download:(NSString *)url progress:(void (^)(NSProgress *progress))progress destination:(NSURL *(^)(NSURL *targetPath, NSURLResponse *response))destination failure:(void (^)(NSURLResponse * response, NSURL * filePath, NSError * error))failure;@end
//// WZYAFNTool.m// 0716-02AFN上传下载GETPOST-01//// Created by 王中尧 on 16/7/16.// Copyright © 2016年 wzy. All rights reserved.//#import "WZYAFNTool.h"#import "AFNetworking.h"@implementation WZYAFNTool+ (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } }];}+ (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } }];}+ (void)unload:(NSString *)uploadUrl parameters:(id)params filePath:(NSString *)filePath name:(NSString *)name progress:(void (^)(NSProgress *progress))progress success:(void (^)(id object))success failure:(void (^)(NSError *error))failure { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager POST:uploadUrl parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { /* 第一个参数:要上传的文件的URL 第二个参数:后台接口规定 第三个参数:错误信息 */ [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:name error:nil]; } progress:^(NSProgress * _Nonnull uploadProgress) { if (progress) { progress(uploadProgress); } } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } }];}+ (void)download:(NSString *)url progress:(void (^)(NSProgress *progress))progress destination:(NSURL *(^)(NSURL *targetPath, NSURLResponse *response))destination failure:(void (^)(NSURLResponse * response, NSURL * filePath, NSError * error))failure { // 1 创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2 创建请求路径 请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; // 3 创建请求下载操作对象 NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { if (progress) { progress(downloadProgress); } } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { if (destination) { return destination(targetPath, response); } else { return nil; } } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { if (failure) { failure(response, filePath, error); } }]; // 4 执行任务发送下载操作请求 [downTask resume];}@end
② 调用
//// ViewController.m// 0716-02AFN上传下载GETPOST-01//// Created by 王中尧 on 16/7/16.// Copyright © 2016年 wzy. All rights reserved.//#import "ViewController.h"#import "AFNetworking.h"#import "WZYAFNTool.h"@interface ViewController ()@end@implementation ViewController- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 使用AFN原生方法// [self getAFN];// [self postAFN];// [self upload];// [self download]; // 使用WZYAFNTool业务类// [self wzyGET];// [self wzyPOST];// [self wzyUpload];// [self wzyDownload];}// AFN GET请求- (void)getAFN { // 1 封装会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2 拼接请求参数 NSDictionary *dict = @{ @"username" : @"xxx", @"pwd" : @"xxx", @"type" : @"JSON" }; // 3 发送请求 /* 第一个参数:请求路径(!不包含参数) 类型是NSString 以前:http://120.25.226.186:32812/login?username=xxx&pwd=xxx&type=JSON 现在:http://120.25.226.186:32812/login 第二个参数:参数(用字典来保存参数) 第三个参数:progress 进度回调 第四个参数:success成功之后的回调 responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON--->OC,此处类型为id,也就是OC对象) task.response:响应头 第五个参数:failure 失败之后的回调 */ [manager GET:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"success---%@---%@", responseObject, [responseObject class]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"failure---%@", error); }]; }// WZYAFNTool GET请求- (void)wzyGET { NSDictionary *dict = @{ @"username" : @"xxx", @"pwd" : @"xxx", @"type" : @"JSON" }; [WZYAFNTool get:@"http://120.25.226.186:32812/login" parameters:dict success:^(id object) { NSLog(@"success---%@", object); } failure:^(NSError *error) { NSLog(@"error---%@", error); }];}// AFN POST请求- (void)postAFN { // 1 封装会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2 拼接请求参数 NSDictionary *dict = @{ @"username" : @"xxx", @"pwd" : @"xxx", @"type" : @"JSON" }; // 3 发送请求 /* 第一个参数:请求路径(!不包含参数) 类型是NSString 以前:http://120.25.226.186:32812/login?username=xxx&pwd=123&type=JSON 现在:http://120.25.226.186:32812/login 第二个参数:参数(用字典来保存参数) 第三个参数:progress 进度回调 第四个参数:success成功之后的回调 responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON--->OC,此处类型为id,也就是OC对象) task.response:响应头 第五个参数:failure 失败之后的回调 */ [manager POST:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"success---%@---%@", responseObject, [responseObject class]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"failure---%@", error); }];}// WZYAFNTool POST请求- (void)wzyPOST { NSDictionary *dict = @{ @"username" : @"xxx", @"pwd" : @"xxx", @"type" : @"JSON" }; [WZYAFNTool post:@"http://120.25.226.186:33122/login" parameters:dict success:^(id object) { NSLog(@"success---%@", object); } failure:^(NSError *error) { NSLog(@"error---%@", error); }];}// AFN 上传- (void)upload { // 1 创建请求者对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2 发送POST请求上传数据文件 NSDictionary *dict = @{@"wzy" : @"wangzhongyao"}; /* 第一个参数: 请求路径 第二个参数: 非文件参数 (字典) 第三个参数: constructingBodyWithBlock 处理上传的文件 第四个参数: progress 进度回调 第五个参数: success 成功之后的回调 responseObject 响应体 第六个参数: failure 失败之后的回调 */ [manager POST:@"http://120.25.226.186:31112/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { /* 第一个参数:要上传的文件的URL 第二个参数:后台接口规定 第三个参数:错误信息 */ [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/wangzhongyao/Desktop/Snip20160716_17.png"] name:@"file" error:nil]; } progress:^(NSProgress * _Nonnull uploadProgress) { // 上传进度 NSLog(@"unload --- %f", 1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { //JSON--->OC 反序列化 NSLog(@"响应体 --- %@",responseObject); // responseObject 响应体 在方法内部就反序列化成功 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 输出错误信息 NSLog(@"%@", error); }];}// WZYAFNTool 上传- (void)wzyUpload { NSDictionary *dict = @{@"wzy" : @"wangzhongyao"}; [WZYAFNTool unload:@"http://120.25.226.186:32812/upload" parameters:dict filePath:@"/Users/wangzhongyao/Desktop/Snip20160716_17.png" name:@"file" progress:^(NSProgress *progress) { // 上传进度 NSLog(@"unload --- %f", 1.0 *progress.completedUnitCount / progress.totalUnitCount); } success:^(id object) { //JSON--->OC 反序列化 NSLog(@"响应体 --- %@",object); // responseObject 响应体 在方法内部就反序列化成功 } failure:^(NSError *error) { // 输出错误信息 NSLog(@"%@", error); }]; }// AFN 下载- (void)download { /* 第一个参数: 请求对象 第二个参数: progress进度回调 第三个参数: destination URL处理的回调 targetPath:文件下载到沙盒中的临时路径 response:响应头信息 返回值: 告诉AFN文件应该剪切到什么地方 第四个参数: completionHandler完成之后的回调 filePath:就是文件的最终保存位置 */ // 1 创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2 创建请求路径 请求对象 NSURL *url = [NSURL URLWithString:@"http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3 创建请求下载操作对象 NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { // 计算进度 NSLog(@"downloading --- %f", 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { // 获得文件下载保存的全路径 NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename]; NSLog(@"fullPath --- %@, tmpPath --- %@", fullPath, targetPath); // 打印需要修改的全路径 & 临时路径 // 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头 return [NSURL fileURLWithPath:fullPath]; // 该block是有返回值的,返回文件剪切保存的路径 } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { NSLog(@"filePath --- %@", filePath); }]; // 4 执行任务发送下载操作请求 [downTask resume];}// WZYAFNTool 下载- (void)wzyDownload { [WZYAFNTool download:@"http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg" progress:^(NSProgress *progress) { // 计算进度 NSLog(@"downloading --- %f", 1.0 * progress.completedUnitCount / progress.totalUnitCount); } destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { // 获得文件下载保存的全路径 NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename]; NSLog(@"fullPath --- %@, tmpPath --- %@", fullPath, targetPath); // 打印需要修改的全路径 & 临时路径 // 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头 return [NSURL fileURLWithPath:fullPath]; } failure:^(NSURLResponse *response, NSURL *filePath, NSError *error) { NSLog(@"filePath --- %@", filePath); // filePath --- (null) }];}@end
2 0
- iOS 【OC 封装网络请求业务类(AFHTTPSessionManager)】
- iOS 【OC 封装网络请求业务类(AFHTTPRequestOperationManager 废弃)】
- iOS 【network-封装业务类AFNetworking(AFHTTPSessionManager)】
- iOS 网络请求类封装
- iOS封装网络请求
- Swift 2.3 【封装网络请求业务类 AFNetworking/ Alamofire】
- 封装AFHTTPSessionManager
- ios 网络请求数据封装类
- ios中封装网络请求类
- ios中封装网络请求类
- ios中封装网络请求类
- ios中封装网络请求类
- iOS网络请求简单封装
- iOS 封装网络请求任务
- IOS 网络请求框架封装
- iOS 原生网络请求封装
- iOS网络请求工具oc版,swift版基于AFNetworking的简单封装
- IOS 开发 AFNetworking 网络工具-网络请求的三次封装 OC版
- css属性第二版
- Android studio使用lambda表达式
- VPN推荐
- requirejs data-main加载总是失败的问题
- arc mrc 自动释放 内存
- iOS 【OC 封装网络请求业务类(AFHTTPSessionManager)】
- java-堆和栈的区别
- 分布式服务框架
- HibernateTemplate的使用
- iOS _ UIButton 标题字体大小颜色位置等
- spring中的autowird流程思考
- 安装kali linux
- java的高精度计算
- QWT学习