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
原创粉丝点击