博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AFNetworking 2.5.x 网络请求的封装
阅读量:5909 次
发布时间:2019-06-19

本文共 19402 字,大约阅读时间需要 64 分钟。

AFNetworking 2.5.x 网络请求的封装

 

源码地址

 

说明

1. 将block形式的请求转换成用代理来处理

2. 你可以通过继承父类,改写父类的某些方法来达到转换请求字典(加密或者其他事宜等),转换获取结果的目的(加密或者其他事宜等)

3. 支持下载进度

 

常规请求源码

////  Networking.h//  NetworkingCraft////  Created by YouXianMing on 15/6/11.//  Copyright (c) 2015年 YouXianMing. All rights reserved.//#import 
@class Networking;typedef enum : NSUInteger { GET_METHOD, // GET请求 POST_METHOD, // POST请求 } AFNetworkingRequestMethod;typedef enum : NSUInteger { HTTPRequestType = 0x11, // 二进制格式 (不设置的话为默认格式) JSONRequestType, // JSON方式 PlistRequestType, // 集合文件方式 } AFNetworkingRequestType;typedef enum : NSUInteger { HTTPResponseType = 0x22, // 二进制格式 (不设置的话为默认格式) JSONResponseType, // JSON方式 PlistResponseType, // 集合文件方式 ImageResponseType, // 图片方式 CompoundResponseType, // 组合方式 } AFNetworkingResponseType;@protocol NetworkingDelegate
@optional/** * 请求成功 * * @param networking Networking实例对象 * @param data 数据 */- (void)requestSucess:(Networking *)networking data:(id)data;/** * 请求失败 * * @param networking Networking实例对象 * @param error 错误信息 */- (void)requestFailed:(Networking *)networking error:(NSError *)error;/** * 用户取消请求 * * @param networking Networking实例对象 * @param error 错误信息 */- (void)userCanceledFailed:(Networking *)networking error:(NSError *)error;@end@interface Networking : NSObject/** * 代理 */@property (nonatomic, weak) id
delegate;/** * 标识符 */@property (nonatomic, strong) NSString *flag;/** * 超时时间间隔(设置了才能生效,不设置,使用的是AFNetworking自身的超时时间间隔) */@property (nonatomic, strong) NSNumber *timeoutInterval;/** * 请求的类型 */@property (nonatomic) AFNetworkingRequestType requestType;/** * 回复的类型 */@property (nonatomic) AFNetworkingResponseType responseType;/** * 请求的方法类型 */@property (nonatomic) AFNetworkingRequestMethod RequestMethod;/** * 网络请求地址 */@property (nonatomic, strong) NSString *urlString;/** * 作为请求用字典 */@property (nonatomic, strong) NSDictionary *requestDictionary;/** * * -====== 此方法由继承的子类来重载实现 ======- * * 转换请求字典 * * @return 转换后的字典 */- (NSDictionary *)transformRequestDictionary;/** * * -====== 此方法由继承的子类来重载实现 ======- * * 对返回的结果进行转换 * * @return 转换后的结果 */- (id)transformRequestData:(id)data;/** * 开始请求 */- (void)startRequest;/** * 取消请求 */- (void)cancelRequest;#pragma mark - 便利构造器方法/** * 便利构造器方法 * * @param urlString 请求地址 * @param requestDictionary 请求参数 * @param delegate 代理 * @param timeoutInterval 超时时间 * @param flag 标签 * @param requestMethod 请求方法 * @param requestType 请求类型 * @param responseType 回复数据类型 * * @return 实例对象 */+ (instancetype)networkingWithUrlString:(NSString *)urlString requestDictionary:(NSDictionary *)requestDictionary delegate:(id)delegate timeoutInterval:(NSNumber *)timeoutInterval flag:(NSString *)flag requestMethod:(AFNetworkingRequestMethod)requestMethod requestType:(AFNetworkingRequestType)requestType responseType:(AFNetworkingResponseType)responseType;@end
////  Networking.m//  NetworkingCraft////  Created by YouXianMing on 15/6/11.//  Copyright (c) 2015年 YouXianMing. All rights reserved.//#import "Networking.h"#import "AFNetworking.h"typedef enum : NSUInteger {        DEALLOC_CANCEL,  // dealloc取消    USER_CANCEL,     // 用户取消    } ECancelType;@interface Networking ()#pragma mark - Private Instance@property (nonatomic, strong) AFHTTPRequestOperationManager *manager;@property (nonatomic, strong) AFHTTPRequestOperation        *httpOperation;@property (nonatomic)         ECancelType                    cancelType;#pragma mark - Private Method/** *  默认设置 */- (void)defaultConfig;/** *  根据序列化枚举值返回对应的请求策略 * *  @param serializerType 序列化枚举值 * *  @return 序列化策略 */+ (AFHTTPRequestSerializer *)requestSerializerWith:(AFNetworkingRequestType)serializerType;/** *  根据序列化枚举值返回对应的回复策略 * *  @param serializerType 序列化枚举值 * *  @return 序列化策略 */+ (AFHTTPResponseSerializer *)responseSerializerWith:(AFNetworkingResponseType)serializerType;@end@implementation Networking/** *  初始化方法 * *  @return 实例对象 */- (instancetype)init {    self = [super init];    if (self) {                // 默认设置        [self defaultConfig];    }    return self;}- (void)defaultConfig {        self.manager = [AFHTTPRequestOperationManager manager];        // 设置回复内容信息    self.manager.responseSerializer.acceptableContentTypes = \        [self.manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];}- (void)startRequest {        if (self.urlString.length <= 0) {        return;    }        // 设置请求类型    if (self.requestType) {        self.manager.requestSerializer  = [Networking requestSerializerWith:self.requestType];    } else {        self.manager.requestSerializer  = [Networking requestSerializerWith:HTTPRequestType];    }        // 设置回复类型    if (self.responseType) {        self.manager.responseSerializer = [Networking responseSerializerWith:self.responseType];    } else {        self.manager.responseSerializer = [Networking responseSerializerWith:HTTPResponseType];    }        // 设置超时时间    if (self.timeoutInterval && self.timeoutInterval.floatValue > 0) {        [self.manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];        self.manager.requestSerializer.timeoutInterval = self.timeoutInterval.floatValue;        [self.manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];    }    // 开始执行请求    if (self.RequestMethod == GET_METHOD) {                __weak Networking *weakSelf = self;        self.httpOperation = [self.manager GET:self.urlString                                    parameters:[weakSelf transformRequestDictionary]                                       success:^(AFHTTPRequestOperation *operation, id responseObject) {                                                                                      if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestSucess:data:)]) {                                               [weakSelf.delegate requestSucess:weakSelf data:[weakSelf transformRequestData:responseObject]];                                           }                                                                                  }                                       failure:^(AFHTTPRequestOperation *operation, NSError *error) {                                                                                      if (self.cancelType == USER_CANCEL) {                                               if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(userCanceledFailed:error:)]) {                                                   [weakSelf.delegate userCanceledFailed:weakSelf error:error];                                                   weakSelf.cancelType = DEALLOC_CANCEL;                                               }                                           } else {                                               if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestFailed:error:)]) {                                                   [weakSelf.delegate requestFailed:weakSelf error:error];                                               }                                           }                                                                                  }];            } else if (self.RequestMethod == POST_METHOD) {            __weak Networking *weakSelf = self;        self.httpOperation = [self.manager POST:self.urlString                                     parameters:[weakSelf transformRequestDictionary]                                        success:^(AFHTTPRequestOperation *operation, id responseObject) {                                                                                        if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestSucess:data:)]) {                                                [weakSelf.delegate requestSucess:weakSelf data:[weakSelf transformRequestData:responseObject]];                                            }                                                                                    }                                        failure:^(AFHTTPRequestOperation *operation, NSError *error) {                                                                                        if (self.cancelType == USER_CANCEL) {                                                if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(userCanceledFailed:error:)]) {                                                    [weakSelf.delegate userCanceledFailed:weakSelf error:error];                                                    weakSelf.cancelType = DEALLOC_CANCEL;                                                }                                            } else {                                                if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(requestFailed:error:)]) {                                                    [weakSelf.delegate requestFailed:weakSelf error:error];                                                }                                            }                                                                                    }];            } else {        }}- (void)cancelRequest {    self.cancelType = USER_CANCEL;    [self.httpOperation cancel];}- (void)dealloc {    self.cancelType = DEALLOC_CANCEL;    [self.httpOperation cancel];}+ (AFHTTPRequestSerializer *)requestSerializerWith:(AFNetworkingRequestType)serializerType {    if (serializerType == JSONRequestType) {        return [AFJSONRequestSerializer serializer];    } else if (serializerType == HTTPRequestType) {        return [AFHTTPRequestSerializer serializer];    } else if (serializerType == PlistRequestType) {        return [AFPropertyListRequestSerializer serializer];    } else {        return nil;    }}+ (AFHTTPResponseSerializer *)responseSerializerWith:(AFNetworkingResponseType)serializerType {    if (serializerType == JSONResponseType) {        return [AFJSONResponseSerializer serializer];    } else if (serializerType == HTTPResponseType) {        return [AFHTTPResponseSerializer serializer];    } else if (serializerType == PlistResponseType) {        return [AFPropertyListResponseSerializer serializer];    } else if (serializerType == ImageResponseType) {        return [AFImageResponseSerializer serializer];    } else if (serializerType == CompoundResponseType) {        return [AFCompoundResponseSerializer serializer];    } else {        return nil;    }}- (NSDictionary *)transformRequestDictionary {    return self.requestDictionary;}- (id)transformRequestData:(id)data {    return data;}+ (instancetype)networkingWithUrlString:(NSString *)urlString                      requestDictionary:(NSDictionary *)requestDictionary                               delegate:(id)delegate                        timeoutInterval:(NSNumber *)timeoutInterval                                   flag:(NSString *)flag                          requestMethod:(AFNetworkingRequestMethod)requestMethod                            requestType:(AFNetworkingRequestType)requestType                           responseType:(AFNetworkingResponseType)responseType {        Networking *networking       = [[[self class] alloc] init];    networking.urlString         = urlString;    networking.requestDictionary = requestDictionary;    networking.delegate          = delegate;    networking.timeoutInterval   = timeoutInterval;    networking.flag              = flag;    networking.RequestMethod     = requestMethod;    networking.requestType       = requestType;    networking.responseType      = responseType;        return networking;}@end
下载请求源码

////  DownloadTask.h//  NetworkingCraft////  Created by YouXianMing on 15/6/11.//  Copyright (c) 2015年 YouXianMing. All rights reserved.//#import 
#import
@class DownloadTask;@protocol DownloadTaskDelegate
@optional/** * 下载任务 * * @param downloadTask 实例对象 * @param progress 进度显示 */- (void)downloadTask:(DownloadTask *)downloadTask withProgress:(CGFloat)progress;/** * 下载失败 * * @param downloadTask 实例对象 * @param error 错误信息 */- (void)downloadTask:(DownloadTask *)downloadTask failedWithError:(NSError *)error;/** * 下载成功 * * @param downloadTask 实例对象 */- (void)downloadTaskSucess:(DownloadTask *)downloadTask;@end@interface DownloadTask : NSObject/** * 代理 */@property (nonatomic, weak) id
delegate;/** * 下载地址 */@property (nonatomic, strong) NSString *urlString;/** * 存储的文件路径(不包括文件名字,如果不设置,则默认在/Library/Caches文件夹下) * * -------------------- * /Documents * /Library/Caches * /Library/Preferences * /tmp * -------------------- * */@property (nonatomic, strong) NSString *filePath;/** * 文件名(如果不给文件名,则使用默认的文件名) */@property (nonatomic, strong) NSString *fileName;/** * 绝对文件路径 */@property (nonatomic, strong, readonly) NSString *file;/** * 开始下载 */- (void)startDownload;/** * 停止下载 */- (void)stopDownload;#pragma mark - 便利构造器/** * 便利构造器 * * @param urlString 下载地址 * @param filePath 文件相对目录(可以不设置) * @param fileName 文件名字(可以不设置) * @param delegate 代理对象 * * @return 实例对象 */+ (instancetype)downloadTaskWithUrlString:(NSString *)urlString fileDirectory:(NSString *)filePath fileName:(NSString *)fileName delegate:(id)delegate;@end
////  DownloadTask.m//  NetworkingCraft////  Created by YouXianMing on 15/6/11.//  Copyright (c) 2015年 YouXianMing. All rights reserved.//#import "DownloadTask.h"#import "AFNetworking.h"@interface DownloadTask ()@property (nonatomic, strong) AFHTTPSessionManager      *session;@property (nonatomic, strong) NSURLSessionDownloadTask  *downloadTask;@property (nonatomic, strong) NSString                  *file;@end@implementation DownloadTask- (instancetype)init {    self = [super init];    if (self) {            [self defaultConfig];    }        return self;}- (void)defaultConfig {    self.session = [AFHTTPSessionManager manager];}- (void)startDownload {        if (self.urlString.length <= 0) {        return;    }        // 定义一个progress指针    NSProgress *progress;        // 创建一个URL链接    NSURL *url = [NSURL URLWithString:self.urlString];        // 初始化一个请求    NSURLRequest *request = [NSURLRequest requestWithURL:url];        // 开始下载任务    __weak DownloadTask *weakSelf = self;    self.downloadTask = \        [self.session downloadTaskWithRequest:request                                     progress:&progress                                  destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {                                                                            // 获取基本路径                                      NSString *filePath = nil;                                                                            // 文件路径                                      if (weakSelf.filePath) {                                          filePath = [weakSelf pathWithSting:self.filePath];                                      } else {                                          filePath = [weakSelf pathWithSting:@"/Library/Caches"];                                      }                                                                            // 文件名字                                      if (weakSelf.fileName) {                                          filePath = [filePath stringByAppendingPathComponent:weakSelf.fileName];                                      } else {                                          filePath = [filePath stringByAppendingPathComponent:[response suggestedFilename]];                                      }                                                                            // 获取文件绝对路径                                      weakSelf.file = filePath;                                                                            NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:filePath];                                                                            return documentsDirectoryURL;                                                                        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {                                                                            if (weakSelf.delegate) {                                          // 结束后移除掉这个progress                                          [progress removeObserver:self                                                        forKeyPath:@"fractionCompleted"                                                           context:nil];                                                                                    if (error == nil) {                                              // 成功                                              if ([weakSelf.delegate respondsToSelector:@selector(downloadTaskSucess:)]) {                                                  [weakSelf.delegate downloadTaskSucess:weakSelf];                                              }                                          } else {                                              // 出错                                              if ([weakSelf.delegate respondsToSelector:@selector(downloadTask:failedWithError:)]) {                                                  [weakSelf.delegate downloadTask:weakSelf failedWithError:error];                                              }                                          }                                                                                }                                  }];        // 开始下载    [self.downloadTask resume];        if (self.delegate) {        // 给这个progress添加监听任务        [progress addObserver:self                   forKeyPath:@"fractionCompleted"                      options:NSKeyValueObservingOptionNew                      context:nil];    }}- (void)stopDownload {    [self.downloadTask cancel];}/** *  获取路径 * *  @param string 相对路径 * *  @return 绝对路径 */- (NSString *)pathWithSting:(NSString *)string {    return [NSHomeDirectory() stringByAppendingPathComponent:string];}- (void)observeValueForKeyPath:(NSString *)keyPath                      ofObject:(id)object                        change:(NSDictionary *)change                       context:(void *)context {    if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) {        NSProgress *progress = (NSProgress *)object;        [_delegate downloadTask:self withProgress:progress.fractionCompleted];    }}+ (instancetype)downloadTaskWithUrlString:(NSString *)urlString                            fileDirectory:(NSString *)filePath                                 fileName:(NSString *)fileName                                 delegate:(id)delegate {        DownloadTask *downloadTask = [[[self class] alloc] init];    downloadTask.urlString     = urlString;    downloadTask.filePath      = filePath;    downloadTask.fileName      = fileName;    downloadTask.delegate      = delegate;        return downloadTask;}@end
使用

转载地址:http://mltpx.baihongyu.com/

你可能感兴趣的文章
chpter11~函数和函数式编程
查看>>
Hadoop之HDFS的常用命令
查看>>
分布式系统架构解决方案之Dubbo(三)--Dubbo管理端 和 Dubbo综合案例
查看>>
The function getUserId must be used with...解决办法
查看>>
懂得保持平衡的程序员
查看>>
Class yii\base\View
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
使用Unirest发送Json的格式数据
查看>>
亚洲诚信&华为云 | 双11钜惠提前来袭,错过等一年!
查看>>
目前所学的关键字整理
查看>>
我的友情链接
查看>>
Eclipse常用配置
查看>>
VMware/vSphere克隆主机网卡启动失败
查看>>
我的友情链接
查看>>
linux修改IP和DNS
查看>>
我的友情链接
查看>>
WordPress新增Page的模版文件
查看>>
sql 子查询和连接查询
查看>>
WP移动设备压缩与解压控件Xceed Zip for .NET Compact Framework控件下载及详细介绍使用方法...
查看>>