AFNetworking3.0 接口封装
来源:互联网 发布:淘宝模特余露 编辑:程序博客网 时间:2024/05/18 02:08
摘要:
在构建App的过程中,为了简化开发过程,一般会集成很多三方库;
而三方库给的使用方法比较适用所有App的所有场景,但是App自身可能所需要使用的功能并不多;
我们今天介绍根据AFNetworking3.0在App中常用的场景而封装的集成使用方法,让介入http和https更简洁。
简介:
AFNetworking在http中请求中,常用的场景如下:
1、get
2、post
3、download 下载
4、multipart upload (用于上传资源)
具体内容:
封装如下接口:
/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask* )asyncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask* )asyncDownloadGet:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,直接返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */- (EMSyncObject* )syncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout;/** * 发送Post请求, 服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送POST请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask* )asyncDownloadPost:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端直接返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */- (EMSyncObject *)syncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout;/** * 发送自定义Request, 服务端返回的原始数据(NSData)会通过callback返回 * * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端直接返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */- (EMSyncObject *)syncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask*)asyncRawDataMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 获取文件信息 * * @param URLString url * @param parameters 参数key,value形式 * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)HEAD:(NSString *)URLString parameters:(NSDictionary *)parameters timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;
不过为了使用方便,进一步封装成如下接口:
/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask* )asyncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask* )asyncDownloadGet:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,直接返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */+ (EMSyncObject* )syncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout;/** * 发送Post请求, 服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送POST请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask* )asyncDownloadPost:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端直接返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */+ (EMSyncObject *)syncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout;/** * 发送自定义Request, 服务端返回的原始数据(NSData)会通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端直接返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */+ (EMSyncObject *)syncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask*)asyncRawDataMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** 获取文件信息 @param URLString url @param parameters 参数key,value形式 @param timeout 超时 @param successBlock 成功回调 @param faildBlock 失败回调 @return EMURLSessionTask */+ (EMURLSessionTask *)HEAD:(NSString *)URLString parameters:(NSDictionary *)parameters timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;#pragma mark - ---- 取消正在发送的网络请求/** * 取消请求 * * @param url 请求的URL,不能为空 */+ (void)cancelRequest:(NSString*)url;/** * 取消请求 * * @param operation 请求的operation,不能为空 */+ (void)cancelOperation:(NSOperation*)operation;/** * 取消所有请求 * */+ (void)cancelAllRequest;
以上代码基本可以解决App中常用的场景,但是为了进一步适用于大部分场景,加上 JSON扩展,具体代码如下:
@interface EMHTTPClient(JSON)/** * 发送GET请求,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;@end
用例:
在app请求时,只需写如下代码即可完成app请求
[EMHTTPClient setValue:es forHTTPHeaderKey:@"Token"]; NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithDictionary:@{ @"brokerid":brokerid }]; [EMHTTPClient asyncRawDataPost:EMBaseGetValidCustomerCountURL paramters:dic timeout:EMHTTPServerTimeOut success:^(EMURLSessionTask *response, id responseObject) { //成功处理 } faild:^(EMURLSessionTask *response, NSError *error) { //失败处理 }];
具体代码如下:
.h
//// EMHTTPClient.h// EMCommunication//// Created by gjz on 15/10/23.// Copyright © 2015年 gjz. All rights reserved.//typedef NSURLSessionTask EMURLSessionTask;#import#import "AFNetworking.h"#import "EMSyncObject.h"#define kDefaultTimeout 10#define kMinTimeout 2#define kMaxTimeout 120#define kTimeoutErrorCode -111111#pragma mark - ----typedef void (^AFSuccessBlock)(EMURLSessionTask *response, id responseObject);typedef void (^AFFaildBlock)(EMURLSessionTask *response, NSError *error);#pragma mark - ----@interface EMMediaObject : NSObject@property (nonatomic, strong) NSData *bytes;//二进制内容@property (nonatomic, copy) NSString *fieldName; //上传到服务器的key@property (nonatomic, copy) NSString *fileName; //上传到服务器,存储的文件名,可选,默认image.jpg@property (nonatomic, copy) NSString *mimeType; //上传到服务器的mimeType,可选,默认image/jpeg+ (EMMediaObject *)mediaObjectWithBytes:(NSData *)bytes name:(NSString *)name;@end#pragma mark - ----@interface EMHTTPClient : NSObject#pragma mark - ---- 初始化/** * 初始化 * * @return 对象 */+ (EMHTTPClient *)client;@property (readonly) AFHTTPSessionManager *httpRequestManager;@property (nonatomic,assign) NSStringEncoding stringEncoding;#pragma mark - ---- HTTP 头/** * 重置HTTP 头 * */- (void)resetSerializer;#pragma mark - ---- HTTP 头/** * 设置自定义HTTP 头 * * @param value value * @param key key */- (void)setValue:(id)value forHTTPHeaderKey:(NSString *)key;#pragma mark - ---- RawData网络请求/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask* )asyncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask* )asyncDownloadGet:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,直接返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */- (EMSyncObject* )syncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout;/** * 发送Post请求, 服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送POST请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask* )asyncDownloadPost:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端直接返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */- (EMSyncObject *)syncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout;/** * 发送自定义Request, 服务端返回的原始数据(NSData)会通过callback返回 * * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端直接返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */- (EMSyncObject *)syncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask*)asyncRawDataMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 获取文件信息 * * @param URLString url * @param parameters 参数key,value形式 * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)HEAD:(NSString *)URLString parameters:(NSDictionary *)parameters timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;#pragma mark - ---- 取消正在发送的网络请求/** * 取消请求 * * @param url 请求的URL,不能为空 */- (void)cancelRequest:(NSString*)url;/** * 取消请求 * * @param operation 请求的operation,不能为空 */- (void)cancelOperation:(EMURLSessionTask*)operation;/** * 取消所有请求 * */- (void)cancelAllRequest;#pragma mark - ---------- 类方法#pragma mark - ---- HTTP 头/** * 重置HTTP 头 * */+ (void)resetSerializer;#pragma mark - ---- HTTP 头/** * 设置自定义HTTP 头 * * @param value value * @param key key */+ (void)setValue:(id)value forHTTPHeaderKey:(NSString *)key;/** * 设置编码格式 头 * * @param encodeing 格式 */+ (void)setStringEncoding:(NSStringEncoding)encodeing;#pragma mark - ---- RawData网络请求/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask* )asyncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask* )asyncDownloadGet:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,直接返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */+ (EMSyncObject* )syncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout;/** * 发送Post请求, 服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送POST请求,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param destinationPath 下载到得文件的目标路径 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask* )asyncDownloadPost:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端直接返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */+ (EMSyncObject *)syncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout;/** * 发送自定义Request, 服务端返回的原始数据(NSData)会通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端直接返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */+ (EMSyncObject *)syncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的原始数据(NSData)会通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask*)asyncRawDataMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** 获取文件信息 @param URLString url @param parameters 参数key,value形式 @param timeout 超时 @param successBlock 成功回调 @param faildBlock 失败回调 @return EMURLSessionTask */+ (EMURLSessionTask *)HEAD:(NSString *)URLString parameters:(NSDictionary *)parameters timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;#pragma mark - ---- 取消正在发送的网络请求/** * 取消请求 * * @param url 请求的URL,不能为空 */+ (void)cancelRequest:(NSString*)url;/** * 取消请求 * * @param operation 请求的operation,不能为空 */+ (void)cancelOperation:(NSOperation*)operation;/** * 取消所有请求 * */+ (void)cancelAllRequest;@end#pragma mark - ----- Request@interface EMHTTPClient(Request)/** * 返回Request * * @param url 请求的URL,参数带在URL里面,不能为空 * @param paramDict 请求带的key/value参数 * @param method 请求的类型Get/Post * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) */+ (NSMutableURLRequest *)httpRequest:(NSString *)url paramters:(NSDictionary *)paramDict method:(NSString *)method timeout:(NSUInteger)timeout;/** * 返回Request * * @param method 请求的类型Get/Post * @param URLString 请求的URL,参数带在URL里面,不能为空 * @param parameters 请求带的key/value参数 * @param block 赋值multipart */+ (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters constructingBodyWithBlock:(void (^)(id formData))block;@end#pragma mark - ----- JSON 网络请求@interface EMHTTPClient(JSON)/** * 发送GET请求,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送GET请求,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param kvParams 请求带的key/value参数 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送Post请求, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 发送自定义Request, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;@end
.m
//// EMHTTPClient.m// EMCommunication//// Created by gjz on 15/10/23.// Copyright © 2015年 gjz. All rights reserved.//#import "EMHTTPClient.h"#import "NSTimer+BlocksKit.h"#import#pragma mark - ----static char key_AFHTTPRequestOperation_Key;@interface NSURLSessionDataTask(EMExt)- (id)extObject;- (void)setExtObject:(id)extObj;@end@implementation NSURLSessionTask(EMExt)- (id)extObject{ return objc_getAssociatedObject(self, &key_AFHTTPRequestOperation_Key);}- (void)setExtObject:(id)extObj{ objc_setAssociatedObject(self, &key_AFHTTPRequestOperation_Key, extObj, OBJC_ASSOCIATION_RETAIN);}@end#pragma mark - ----@interface NSURLSessionTask(AFHTTPRequestOperationHelper)@end@implementation NSURLSessionTask(AFHTTPRequestOperationHelper)+(void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(cancel); SEL swizzledSelector = @selector(swizzled_cancel); Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } });}#pragma mark - Method Swizzling- (void)swizzled_cancel { NSTimer *timer = (NSTimer *)self.extObject; if (timer) { [timer invalidate]; timer = nil; } [self swizzled_cancel];}@end#pragma mark - ----@implementation EMMediaObject+ (EMMediaObject *)mediaObjectWithBytes:(NSData *)bytes name:(NSString *)name{ EMMediaObject *mediaObj = [[EMMediaObject alloc] init]; mediaObj.bytes = bytes; mediaObj.fieldName = name; mediaObj.fileName = @"image.jpg"; mediaObj.mimeType = @"image/jpeg"; return mediaObj;}@end#pragma mark - ----@interface EMHTTPClient(){ }@property (nonatomic, strong) AFHTTPSessionManager *inner_httpRequestManager;- (EMURLSessionTask *)inner_asyncHTTPRequest:(NSString *)url paramters:(NSDictionary *)paramDict method:(NSString *)method timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;- (EMSyncObject *)inner_syncHTTPRequest:(NSString *)url paramters:(NSDictionary *)paramDict method:(NSString *)method timeout:(NSUInteger)timeout;- (EMURLSessionTask* )inner_asyncDownloadRequest:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath method:(NSString *)method timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock;@end@implementation EMHTTPClient#pragma mark - ---- 初始化+ (instancetype)client{ return [[self alloc] init];}- (EMHTTPClient *)init{ if (self = [super init]) { self.inner_httpRequestManager = [AFHTTPSessionManager manager]; [self resetSerializer]; } return self;}- (void)resetSerializer{ self.inner_httpRequestManager.requestSerializer = [[AFHTTPRequestSerializer alloc] init]; self.inner_httpRequestManager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];}- (AFHTTPSessionManager *)httpRequestManager{ return self.inner_httpRequestManager;}- (void)setValue:(id)value forHTTPHeaderKey:(NSString *)key{ [self.inner_httpRequestManager.requestSerializer setValue:value forHTTPHeaderField:key];}-(void)setStringEncoding:(NSStringEncoding)stringEncoding { _stringEncoding = stringEncoding; if (self.inner_httpRequestManager) { self.inner_httpRequestManager.requestSerializer.stringEncoding = stringEncoding; }}#pragma mark - ----- 各种请求发送- (EMURLSessionTask*)asyncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ NSParameterAssert(url); return [self inner_asyncHTTPRequest:url paramters:kvParams method:@"GET" timeout:timeout success:successBlock faild:faildBlock];}- (EMURLSessionTask* )asyncDownloadGet:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock { NSParameterAssert(url); return [self inner_asyncDownloadRequest:url paramters:kvParams destinationPath:destinationPath method:@"GET" timeout:timeout success:successBlock faild:faildBlock];}- (EMSyncObject* )syncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout { NSParameterAssert(url); dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //创建信号量 EMSyncObject *ret = [[EMSyncObject alloc]init]; EMURLSessionTask *opt = [self.inner_httpRequestManager GET:url parameters:kvParams progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { ret.responseObject = responseObject; ret.task = task; dispatch_semaphore_signal(semaphore); //发送信号 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { ret.error = error; ret.task = task; dispatch_semaphore_signal(semaphore); //发送信号 }]; [opt resume]; dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER); //等待 return ret;}- (EMURLSessionTask *)asyncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ NSParameterAssert(url); return [self inner_asyncHTTPRequest:url paramters:paramDict method:@"POST" timeout:timeout success:successBlock faild:faildBlock];}- (EMURLSessionTask* )asyncDownloadPost:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock { NSParameterAssert(url); return [self inner_asyncDownloadRequest:url paramters:kvParams destinationPath:destinationPath method:@"POST" timeout:timeout success:successBlock faild:faildBlock];}- (EMSyncObject *)syncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout { NSParameterAssert(url); return [self inner_syncHTTPRequest:url paramters:paramDict method:@"POST" timeout:timeout];}- (EMURLSessionTask *)asyncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ NSParameterAssert(request); __block int fTimeout = (int)timeout; if (timeout > kMaxTimeout || timeout < kMinTimeout) { fTimeout = kDefaultTimeout; } EMURLSessionTask *opt = [self.inner_httpRequestManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (error == nil) { NSTimer *timer = (NSTimer *)opt.extObject; [timer invalidate]; timer = nil; if (successBlock) { successBlock(opt, responseObject); } } else { NSTimer *timer = (NSTimer *)opt.extObject; [timer invalidate]; timer = nil; if (faildBlock) { faildBlock(opt, error); } } }]; NSTimer *timerd = [NSTimer bk_scheduledTimerWithTimeInterval:fTimeout block:^(NSTimer *timer) { [opt cancel]; [opt setExtObject:nil]; if(opt.state != NSURLSessionTaskStateCompleted) { NSError *timeoutError = [self timeoutError:fTimeout]; if (faildBlock) { faildBlock(opt, timeoutError); } } [timer invalidate]; timer = nil; } repeats:NO]; [opt setExtObject:timerd]; [opt resume]; return opt;}- (EMSyncObject *)syncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout { NSParameterAssert(request); dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //创建信号量 EMSyncObject *ret = [[EMSyncObject alloc]init]; EMURLSessionTask *opt = [self.inner_httpRequestManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { ret.responseObject = responseObject; ret.error = error; ret.task = opt; dispatch_semaphore_signal(semaphore); //发送信号 }]; [opt resume]; dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER); //等待 return ret;}- (EMURLSessionTask*)asyncRawDataMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ NSParameterAssert(url); NSString *urld = [url copy]; NSError *serializationError = nil; NSMutableURLRequest *request = [self.httpRequestManager.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:urld parameters:paramDict constructingBodyWithBlock:^(id formData) { [formData appendPartWithFileData:mediaObj.bytes name:mediaObj.fieldName fileName:mediaObj.fileName mimeType:mediaObj.mimeType]; } error:&serializationError]; if (serializationError && faildBlock) { dispatch_async(dispatch_get_main_queue(), ^{ faildBlock(nil, serializationError); }); return nil; } else { return [self asyncRawDataRequest:request timeout:timeout success:successBlock faild:faildBlock]; }}- (EMURLSessionTask *)HEAD:(NSString *)URLString parameters:(NSDictionary *)parameters timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock { __block int fTimeout = (int)timeout; if (timeout > kMaxTimeout || timeout < kMinTimeout) { fTimeout = kDefaultTimeout; } EMURLSessionTask *opt = [self.inner_httpRequestManager HEAD:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task) { NSTimer *timer = (NSTimer *)opt.extObject; [timer invalidate]; timer = nil; if (successBlock) { successBlock(opt, task.response); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSTimer *timer = (NSTimer *)opt.extObject; [timer invalidate]; timer = nil; if (faildBlock) { faildBlock(opt, error); } }]; NSTimer *timerd = [NSTimer bk_scheduledTimerWithTimeInterval:fTimeout block:^(NSTimer *timer) { [opt cancel]; [opt setExtObject:nil]; if(opt.state != NSURLSessionTaskStateCompleted) { NSError *timeoutError = [self timeoutError:fTimeout]; if (faildBlock) { faildBlock(opt, timeoutError); } } [timer invalidate]; timer = nil; } repeats:NO]; [opt setExtObject:timerd]; return opt;}#pragma mark - ---- 请求取消- (void)cancelRequest:(NSString*)url{ if (url == nil) { return; } NSArray *opts = self.inner_httpRequestManager.tasks; for (EMURLSessionTask *opt in opts) { if ([[opt.currentRequest.URL.absoluteString lowercaseString] hasPrefix:[url lowercaseString]]) { [opt cancel]; NSTimer *timer = (NSTimer*)opt.extObject; if (timer) { [timer invalidate]; timer = nil; } [opt cancel]; } } }- (void)cancelOperation:(EMURLSessionTask*)operation { if (operation == nil) { return; } [operation cancel]; NSTimer *timer = (NSTimer*)operation.extObject; if (timer) { [timer invalidate]; timer = nil; } }- (void)cancelAllRequest{ NSArray *opts = self.inner_httpRequestManager.tasks; for (EMURLSessionTask *opt in opts) { NSTimer *timer = (NSTimer*)opt.extObject; [timer invalidate]; timer = nil; [opt cancel]; }}#pragma mark - ---------- 类方法+ (void)resetSerializer{ [EMHTTPClient client].inner_httpRequestManager.requestSerializer = [[AFHTTPRequestSerializer alloc] init]; [EMHTTPClient client].inner_httpRequestManager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];}+ (void)setValue:(id)value forHTTPHeaderKey:(NSString *)key{ [[EMHTTPClient client].inner_httpRequestManager.requestSerializer setValue:value forHTTPHeaderField:key];}+ (void)setStringEncoding:(NSStringEncoding)encodeing { [[EMHTTPClient client] setStringEncoding:encodeing];}#pragma mark - ----- 各种请求发送+ (EMURLSessionTask*)asyncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client]asyncRawDataGet:url paramters:kvParams timeout:timeout success:successBlock faild:faildBlock];}+ (EMURLSessionTask* )asyncDownloadGet:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock { return [[EMHTTPClient client] asyncDownloadGet:url paramters:kvParams destinationPath:destinationPath timeout:timeout success:successBlock faild:faildBlock];}+ (EMSyncObject* )syncRawDataGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout { NSParameterAssert(url); return [[EMHTTPClient client] inner_syncHTTPRequest:url paramters:kvParams method:@"GET" timeout:timeout];}+ (EMURLSessionTask *)asyncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client]asyncRawDataPost:url paramters:paramDict timeout:timeout success:successBlock faild:faildBlock];}+ (EMURLSessionTask* )asyncDownloadPost:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock { return [[EMHTTPClient client]asyncDownloadPost:url paramters:kvParams destinationPath:destinationPath timeout:timeout success:successBlock faild:faildBlock];}+ (EMSyncObject *)syncRawDataPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout { return [[EMHTTPClient client] syncRawDataPost:url paramters:paramDict timeout:timeout];}+ (EMURLSessionTask *)asyncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client]asyncRawDataRequest:request timeout:timeout success:successBlock faild:faildBlock];}+ (EMSyncObject *)syncRawDataRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout { return [[EMHTTPClient client]syncRawDataRequest:request timeout:timeout];}+ (EMURLSessionTask*)asyncRawDataMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client]asyncRawDataMultipartFormPost:url paramters:paramDict mediaObject:mediaObj timeout:timeout success:successBlock faild:faildBlock];}+ (EMURLSessionTask *)HEAD:(NSString *)URLString parameters:(NSDictionary *)parameters timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock { return [[EMHTTPClient client]HEAD:URLString parameters:parameters timeout:timeout success:successBlock faild:faildBlock];}#pragma mark - ---- 请求取消+ (void)cancelRequest:(NSString*)url{ [[EMHTTPClient client]cancelRequest:url];}+ (void)cancelOperation:(EMURLSessionTask*)operation { [[EMHTTPClient client]cancelOperation:operation];}+ (void)cancelAllRequest{ [[EMHTTPClient client]cancelAllRequest];}#pragma mark - ---- inner- (NSError *)timeoutError:(int)timeout{ return [NSError errorWithDomain:[NSString stringWithFormat:@"网络请求超过设置的超时时间[%d]", timeout] code:kTimeoutErrorCode userInfo:nil];}- (EMURLSessionTask *)inner_asyncHTTPRequest:(NSString *)url paramters:(NSDictionary *)paramDict method:(NSString *)method timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ NSParameterAssert(url); NSParameterAssert(method); NSError *serializationError = nil; NSMutableURLRequest *request = [self.inner_httpRequestManager.requestSerializer requestWithMethod:method URLString:[url copy] parameters:paramDict error:&serializationError]; request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; request.timeoutInterval = timeout; if (serializationError && faildBlock) { dispatch_async(dispatch_get_main_queue(), ^{ faildBlock(nil, serializationError); }); return nil; } else { return [self asyncRawDataRequest:request timeout:timeout success:successBlock faild:faildBlock]; }}- (EMSyncObject *)inner_syncHTTPRequest:(NSString *)url paramters:(NSDictionary *)paramDict method:(NSString *)method timeout:(NSUInteger)timeout { NSParameterAssert(url); NSParameterAssert(method); int fTimeout = (int)timeout; if (timeout > kMaxTimeout || timeout < kMinTimeout) { fTimeout = kDefaultTimeout; } NSError *serializationError = nil; NSMutableURLRequest *request = [self.inner_httpRequestManager.requestSerializer requestWithMethod:method URLString:[url copy] parameters:paramDict error:&serializationError]; request.timeoutInterval = timeout; if (serializationError) { return nil; } else { return [self syncRawDataRequest:request timeout:timeout]; }}- (EMURLSessionTask* )inner_asyncDownloadRequest:(NSString *)url paramters:(NSDictionary *)kvParams destinationPath:(NSString *)destinationPath method:(NSString *)method timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock { NSParameterAssert(url); NSParameterAssert(method); NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; NSURL *URL = [NSURL URLWithString:url]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; EMURLSessionTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { NSURL *documentsDirectoryURL = [[NSURL alloc]initFileURLWithPath:NSTemporaryDirectory()]; return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { if (error == nil) { successBlock(downloadTask,nil); } else { faildBlock(downloadTask, error); } }]; [downloadTask resume]; return downloadTask;}@end#pragma mark - ----- Request@implementation EMHTTPClient (Request)+ (NSMutableURLRequest *)httpRequest:(NSString *)url paramters:(NSDictionary *)paramDict method:(NSString *)method timeout:(NSUInteger)timeout { NSParameterAssert(url); NSParameterAssert(method); NSError *serializationError = nil; NSMutableURLRequest *request = [[EMHTTPClient client].inner_httpRequestManager.requestSerializer requestWithMethod:method URLString:[url copy] parameters:paramDict error:&serializationError]; if(serializationError) { return nil; } else { return request; }}+ (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters constructingBodyWithBlock:(void (^)(id formData))block { NSError *error; NSMutableURLRequest *request = [[EMHTTPClient client].inner_httpRequestManager.requestSerializer multipartFormRequestWithMethod:method URLString:URLString parameters:parameters constructingBodyWithBlock:block error:&error]; if (error) { return nil; } else { return request; }}@end#pragma mark - ----- JSON Request@implementation EMHTTPClient(JSON)/** * 发送GET请求,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask*)asyncJSONGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [self asyncRawDataGet:url paramters:kvParams timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock];}/** * 发送Post请求, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [self asyncRawDataPost:url paramters:paramDict timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock];}/** * 发送自定义Request, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [self asyncRawDataRequest:request timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock]; }/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */- (EMURLSessionTask *)asyncJSONMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [self asyncRawDataMultipartFormPost:url paramters:paramDict mediaObject:mediaObj timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock]; }/** * 发送GET请求,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,参数带在URL里面,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask*)asyncJSONGet:(NSString *)url paramters:(NSDictionary *)kvParams timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client] asyncRawDataGet:url paramters:kvParams timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock];}/** * 发送Post请求, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 请求的URL,不能为空 * @param paramDict post的参数key,value形式 * @param timeout timeout时间,单位是秒,如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONPost:(NSString *)url paramters:(NSDictionary *)paramDict timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client] asyncRawDataPost:url paramters:paramDict timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock];}/** * 发送自定义Request, 服务端返回的数据会被JSON Decode,再通过callback返回 * * @param request 发送的Request对象,不能为空 * @param timeout timeout时间,单位是秒, 如果timeout>=kMaxTimeout(120秒)||timeout<=kMinTimeout(3秒)时候,会使用默认值kDefaultTimeout(15秒) * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONRequest:(NSURLRequest *)request timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client] asyncRawDataRequest:request timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock]; }/** * 上传多媒体文件,比如图片, multipart-form形式post上传,服务端返回的数据会被JSON Decode,再通过callback返回 * * @param url 上传URL,不能为空 * @param paramDict 参数key,value形式 * @param mediaObj media数据 * @param timeout timeout时间,单位是秒, 如果timeout>=120||timeout<=0时候,会使用默认值15s * @param successBlock 成功回调 * @param faildBlock 失败回调 */+ (EMURLSessionTask *)asyncJSONMultipartFormPost:(NSString *)url paramters:(NSDictionary *)paramDict mediaObject:(EMMediaObject *)mediaObj timeout:(NSUInteger)timeout success:(AFSuccessBlock)successBlock faild:(AFFaildBlock)faildBlock{ return [[EMHTTPClient client] asyncRawDataMultipartFormPost:url paramters:paramDict mediaObject:mediaObj timeout:timeout success:^(EMURLSessionTask *operation, id responseObject) { [EMHTTPClient JSONRequestSuccessCallbackWithOperation:operation response:responseObject successBlock:successBlock faildBlock:faildBlock]; } faild:faildBlock]; }#pragma mark - --- inner API+ (id)objectFromJSONResponseData:(NSData *)responseData{ NSError *error = nil; id retObj = nil; if (responseData == nil) { error = [NSError errorWithDomain:@"JSON_Decode_Empty_Response" code:-1001 userInfo:nil]; } else { retObj = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error]; } if (error == nil && retObj != nil) { return retObj; } else { error = [NSError errorWithDomain:@"JSON_Decode_Failed" code:-1002 userInfo:nil]; return error; }}+ (void)JSONRequestSuccessCallbackWithOperation:(EMURLSessionTask*)operation response:(id)responseObject successBlock:(AFSuccessBlock)cbSuccessBlock faildBlock:(AFFaildBlock)cbFaildBlock{ if (cbSuccessBlock != nil) { id retObj = [EMHTTPClient objectFromJSONResponseData:responseObject]; if ([retObj isKindOfClass:[NSError class]]) { if (cbFaildBlock != nil) { cbFaildBlock(operation, retObj); } } else { cbSuccessBlock(operation, retObj); } }}@end
0 0
- AFNetworking3.0 接口封装
- AFNetworking3.0封装
- 封装AFNetworking3.0
- 基于AFNetworking3.0网络封装
- 基于AFNetworking3.0网络封装
- AFNetWorking3.0的简单封装
- 基于AFNetworking3.0的网络封装
- 用AFNetworking3.0封装网络请求
- 用AFNetworking3.0封装网络请求
- 用AFNetworking3.0封装网络请求
- 使用AFNetworking3.0封装网络请求
- 基于AFNetWorking3.0的简单封装
- AFNetWorking3.0简单封装及Https
- AFNetWorking3.0 上传图片 和 简单封装
- 使用AFNetworking3.0实现接口异步并发
- AFNetworking3.1 二次封装
- AFNetworking3.0网络请求方法封装(自带缓存功能)
- AFNetworking3.0网络请求方法封装(自带缓存功能)
- 内点法+外点法
- 购物车加减控件
- COOKIE和SESSION有什么区别
- Android View绘制过程
- internDay2
- AFNetworking3.0 接口封装
- Linux定时任务cron和crontab
- TeXStudio安装与入门
- ios searchDisplayController搜索界面显示“无结果”、"No Results"
- vlan间的路由(五)
- 玄学算法CDQ分治
- 使用PickerView
- php composer安装 &&配置国内镜像
- iOS 使用UICollectionView实现图片轮播