美文网首页
AFNetworking 3.X 的二次封装(GET、POST、

AFNetworking 3.X 的二次封装(GET、POST、

作者: CCSHCoder | 来源:发表于2017-07-20 10:44 被阅读226次
  • .h文件
/**
 GET请求

 @param retryNum 重试次数
 @param url 网址
 @param param 参数
 @param progress 进度
 @param success 成功
 @param failure 失败
 */
+ (void)getWithRetryNum:(NSInteger)retryNum Url:(NSString *)url param:(NSDictionary *) param progress:(void (^)(NSProgress *progress))progress success:(void (^)(id responseObj))success failure:(void (^)(NSError *error))failure;

/**
 POST请求

 @param retryNum 重试次数
 @param url 网址
 @param param 参数
 @param progress 进度
 @param success 成功
 @param failure 失败
 */
+ (void)postWithRetryNum:(NSInteger)retryNum Url:(NSString *)url param:(NSDictionary *)param progress:(void (^)(NSProgress *progress))progress success:(void (^)(id responseObj))success failure:(void (^)(NSError *error))failure;

/**
 POST文件上传

 @param retryNum 重试次数
 @param url 网址
 @param param 参数
 @param fileType 文件类型
 @param file 文件路径
 @param progress 进度
 @param success 成功
 @param failure 失败
 */
+ (void)postUploadFileWithRetryNum:(NSInteger)retryNum Url:(NSString *)url param:(NSDictionary *)param FileType:(NSString *)fileType File:(NSString *)file progress:(void (^)(NSProgress *progress))progress success:(void (^)(id responseObj))success failure:(void (^)(NSError *error))failure;

/**
 文件下载

 @param retryNum 重试次数
 @param url 网址
 @param file 文件下载路径
 @param progress 进度
 @param success 成功
 @param failure 失败
 */
+ (void)downLoadFlieWithRetryNum:(NSInteger)retryNum Url:(NSString *)url flie:(NSString *)file progress:(void (^)(NSProgress *))progress success:(void (^)(id))success failure:(void (^)(NSError *))failure;

//取消所有网络请求
+ (void)cancelAllOperations;
  • .m文件
//超时设置
#define TimeOut 30
//请求队列
static NSMutableArray <NSURLSessionDataTask *>*operationQueueArr;

#pragma mark - 实例化请求对象
+ (AFHTTPSessionManager *)getAFHTTPSessionManager{

    
    static AFHTTPSessionManager *mgr;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 1.获得请求管理者
        mgr = [AFHTTPSessionManager manager];
        // 2.添加参数
        mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil];
        
        // 3.支持HTTPS
        mgr.securityPolicy.allowInvalidCertificates = YES;
        mgr.securityPolicy.validatesDomainName = NO;
        
        operationQueueArr = [[NSMutableArray alloc]init];
    });
    
    // 4.设置请求头
    [mgr.requestSerializer setValue:[kSHUserDefaults objectForKey:kToken] forHTTPHeaderField:@"token"];
    [mgr.requestSerializer setValue:[kSHUserDefaults objectForKey:kCid] forHTTPHeaderField:@"cid"];

    return mgr;
}

#pragma mark - GET
+ (void)getWithRetryNum:(NSInteger)retryNum Url:(NSString *)url param:(NSDictionary *)param progress:(void (^)(NSProgress *))progress success:(void (^)(id))success failure:(void (^)(NSError *))failure {
    
    // 发送GET请求
    dispatch_async(dispatch_get_main_queue(), ^{
        
        AFHTTPSessionManager *mgr = [SHBaseHttp getAFHTTPSessionManager];

        // 设置超时(可以针对不同的Url进行超时设置)
        mgr.requestSerializer.timeoutInterval = TimeOut;
        
        NSURLSessionDataTask *task = [mgr GET:url parameters:param progress:^(NSProgress * _Nonnull downloadProgress) {
            if (progress) {
                progress(downloadProgress);
            }
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            //移除队列
            [operationQueueArr removeObject:task];
            
            if (success) {
                success(responseObject);
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            //移除队列
            [operationQueueArr removeObject:task];
            
            if (retryNum > 0) {
                //重新请求
                [self getWithRetryNum:retryNum-1 Url:url param:param progress:progress success:success failure:failure];
            }else{
                if (failure) {
                    failure(error);
                }
            }
        }];
        //添加队列
        [operationQueueArr addObject:task];
    });
}

#pragma mark - POST
+ (void)postWithRetryNum:(NSInteger)retryNum Url:(NSString *)url param:(NSDictionary *)param progress:(void (^)(NSProgress *))progress success:(void (^)(id))success failure:(void (^)(NSError *))failure{
    
    // 发送POST请求
    dispatch_async(dispatch_get_main_queue(), ^{
        
        AFHTTPSessionManager *mgr = [SHBaseHttp getAFHTTPSessionManager];
        
        // 设置超时(可以针对不同的Url进行超时设置)
        mgr.requestSerializer.timeoutInterval = TimeOut;
        
        NSURLSessionDataTask *task = [mgr POST:url parameters:param progress:^(NSProgress * _Nonnull downloadProgress) {
            if (progress) {
                progress(downloadProgress);
            }
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            //移除队列
            [operationQueueArr removeObject:task];
            
            if (success) {
                success(responseObject);
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            //移除队列
            [operationQueueArr removeObject:task];
            
            if (retryNum > 0) {
                //重新请求
                [self postWithRetryNum:retryNum-1 Url:url param:param progress:progress success:success failure:failure];
            }else{
                if (failure) {
                    failure(error);
                }
            }
        }];
        //添加队列
        [operationQueueArr addObject:task];
    });
}

#pragma mark - 文件上传
+ (void)postUploadFileWithRetryNum:(NSInteger)retryNum Url:(NSString *)url param:(NSDictionary *)param FileType:(NSString *)fileType File:(NSString *)file progress:(void (^)(NSProgress *))progress success:(void (^)(id))success failure:(void (^)(NSError *))failure{
    
    // 发送文件上传
    NSURLSessionDataTask *task = [[SHBaseHttp getAFHTTPSessionManager] POST:url parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        NSData *data = [NSData dataWithContentsOfFile:file];
        if (data) {
             [formData appendPartWithFileData:data name:@"file" fileName:file.lastPathComponent mimeType:fileType];
        }
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        SHLog(@"文件上传进度:%f",uploadProgress.fractionCompleted);
        if (progress) {
            progress(uploadProgress);
        }
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //移除队列
        [operationQueueArr removeObject:task];
        
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        //移除队列
        [operationQueueArr removeObject:task];
        
        if (retryNum > 0) {
            //重新请求
            [self postUploadFileWithRetryNum:retryNum-1 Url:url param:param FileType:fileType File:file progress:progress success:success failure:failure];
        }else{
            if (failure) {
                failure(error);
            }
        }
    }];
    //添加队列
    [operationQueueArr addObject:task];
}

#pragma mark - 文件下载
+ (void)downLoadFlieWithRetryNum:(NSInteger)retryNum Url:(NSString *)url flie:(NSString *)file progress:(void (^)(NSProgress *))progress success:(void (^)(id))success failure:(void (^)(NSError *))failure{
    
    //1.创建会话管理者
    NSURL *fileUrl = [NSURL URLWithString:url];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl];
    
    //2.下载文件
    NSURLSessionDownloadTask *task = [[SHBaseHttp getAFHTTPSessionManager] downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        
        SHLog(@"文件下载进度:%f",downloadProgress.fractionCompleted);
        if (progress) {
            progress(downloadProgress);
        }
        
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        
        return [NSURL fileURLWithPath:file];
        
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        
        if (error) {
            if (retryNum > 0) {
                NSInteger num = retryNum;
                //重新请求
                [self downLoadFlieWithRetryNum:--num Url:url flie:file progress:progress success:success failure:failure];
            }else{
                if (failure) {
                    failure(error);
                }
            }
        }else{
            if (success) {
                success([filePath path]);
            }
        }
    }];
    
    //3.执行Task
    [task resume];
}

#pragma mark - 取消所有网络请求
+ (void)cancelAllOperations{
    
    for (int i = 0; i < operationQueueArr.count; i++) {

        NSURLSessionDataTask *task = operationQueueArr[0];
        //取消请求
        [task cancel];
        //移除队列
        [operationQueueArr removeObject:task];
    }
}

相关文章

网友评论

      本文标题:AFNetworking 3.X 的二次封装(GET、POST、

      本文链接:https://www.haomeiwen.com/subject/xtsdkxtx.html