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