iOS 【OC 封装网络请求业务类(AFHTTPSessionManager)】

由于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 
@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  _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 *)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  _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



你可能感兴趣的:(iOS)