RequstManager


//IceRequestManager.h

#import <Foundation/Foundation.h>
#import <AFNetworking.h>

typedef NS_ENUM(NSInteger, iceRequstType) {
    iceRequstTypeGET       = 0,
    iceRequstTypePOST,
    iceRequstTypePUT,
    iceRequstTypePATCH,
    iceRequstTypeDELETE,
};

@interface IceRequestManager : NSObject

+ (void)request: (iceRequstType)type URL:(NSString *)urlString Header:(void (^)(AFHTTPRequestSerializer *header))header Parameter:(void (^)(NSMutableDictionary *param))parameter Progress:(void (^)(NSProgress *rate))progress Success:(void (^)(id response))success Failure:(void (^)(NSError *error))failure;
+ (void)cancelRequest;

@end

//IceRequestManager.m

#import "IceRequestManager.h"
#define iceWeakSelf    __weak typeof(self) weakSelf = self;
#define iceStrongSelf  __strong typeof(self) strongSelf = weakSelf;


@interface IceRequestManager ()
@property(strong, nonatomic)AFHTTPSessionManager *afnManager;

@end


@implementation IceRequestManager
#pragma 单例
static IceRequestManager* _manager = nil;
+ (instancetype)manager {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _manager = [[super allocWithZone:NULL] init];
    });
    return _manager;
}

+ (id)allocWithZone: (struct _NSZone *)zone {
    return [self manager];
}

- (id)copyWithZone: (struct _NSZone *)zone {
    return [[self class] manager];
}

/*=================================================================================================*/
#pragma 获得afnManager
- (AFHTTPSessionManager *)afnManager {
    if (!_afnManager) {
        //初始化
        AFHTTPSessionManager *afnManager = [AFHTTPSessionManager manager];
        //https
        AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
        policy.allowInvalidCertificates = YES;
        policy.validatesDomainName = NO;
        afnManager.securityPolicy = policy;
        
        _afnManager = afnManager;
    }
    return _afnManager;
}

/*=================================================================================================*/
#pragma 类方法
+ (void)request: (iceRequstType)type URL:(NSString *)urlString Header:(void (^)(AFHTTPRequestSerializer *header))header Parameter:(void (^)(NSMutableDictionary *param))parameter Progress:(void (^)(NSProgress *rate))progress Success:(void (^)(id response))success Failure:(void (^)(NSError *error))failure {
    [[self manager] request:type URL:urlString Header:header Parameter:parameter Progress:progress Success:success Failure:failure];
}

+ (void)cancelRequest {
    [[self manager] cancelRequest];
}

/*=================================================================================================*/
#pragma 实例方法
- (void)request: (iceRequstType)type URL:(NSString *)urlString Header:(void (^)(AFHTTPRequestSerializer *header))header Parameter:(void (^)(NSMutableDictionary *param))parameter Progress:(void (^)(NSProgress *rate))progress Success:(void (^)(id response))success Failure:(void (^)(NSError *error))failure {
    //设置请求头、参数
    NSMutableDictionary *paramM = [self handelHeader:header Parameter:parameter];
    iceWeakSelf
    switch (type) {
        case iceRequstTypeGET: {
            [self.afnManager GET:urlString parameters:paramM progress:progress success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                [weakSelf handelSuccess:responseObject success:success];
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                [weakSelf handelError:error task:task failure:failure];
            }];
        }
            break;
            
        case iceRequstTypePOST: {
            [self.afnManager POST:urlString parameters:paramM progress:progress success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                [weakSelf handelSuccess:responseObject success:success];
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                [weakSelf handelError:error task:task failure:failure];
            }];
        }
            break;
            
        case iceRequstTypePUT: {
            [self.afnManager PUT:urlString parameters:paramM success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                [weakSelf handelSuccess:responseObject success:success];
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                [weakSelf handelError:error task:task failure:failure];
            }];
        }
            break;
            
        case iceRequstTypePATCH: {
            [self.afnManager PATCH:urlString parameters:paramM success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                [weakSelf handelSuccess:responseObject success:success];
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                [weakSelf handelError:error task:task failure:failure];
            }];
        }
            break;
            
        case iceRequstTypeDELETE: {
            [self.afnManager DELETE:urlString parameters:paramM success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                [weakSelf handelSuccess:responseObject success:success];
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                [weakSelf handelError:error task:task failure:failure];
            }];
        }
            break;
            
        default:
            break;
    }
    
}

- (void)cancelRequest {
    [self.afnManager.session invalidateAndCancel];
}

/*=================================================================================================*/
#pragma 请求头和参数的处理
- (NSMutableDictionary *)handelHeader:(void (^)(AFHTTPRequestSerializer *))header Parameter:(void (^)(NSMutableDictionary *))parameter{
    //设置请求头
    self.afnManager.requestSerializer = [AFJSONRequestSerializer serializer];
    //self.afnManager.requestSerializer setValue:@"" forHTTPHeaderField:@"";
    if (header) {
        header(self.afnManager.requestSerializer);
    }
    //设置请求参数
    NSMutableDictionary *paramM = [NSMutableDictionary dictionary];
    //paramM setValue:@"" forKey:@"";
    if (parameter) {
        parameter(paramM);
    }
    return paramM;
}

#pragma 处理回调
//成功
- (void)handelSuccess: (id)responseObject success:(void (^)(id))success {
    if (responseObject[@"data"]) {
        if ([responseObject[@"code"] integerValue] == 0) {
            if (success) {
                success(responseObject[@"data"]);
            }
        }else {
            NSLog(@"code错误!==> %@ /n", responseObject);
        }
    }else {
        if (success) {
            success(responseObject);
        }
    }
}
//失败
- (void)handelError: (NSError *)error task: (NSURLSessionDataTask *)task failure:(void (^)(NSError *))failure {
    if (failure) {
        failure(error);
    }
    NSHTTPURLResponse * responses = (NSHTTPURLResponse *)task.response;
    NSLog(@"错误码:%zd", responses.statusCode);
    
    NSData *data = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey];
    if (data) {
        id body = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        if ([body isKindOfClass:[NSDictionary class]]) {
            NSDictionary *dict = (NSDictionary *)body;
            if (dict[@"code"]) {
                NSLog(@"错误信息:%@", dict[@"errmsg"]);
            }
        }
    }
}


@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 7,588评论 0 3
  • 1.许多年前一位在思考方面有研究的专家做出了以下评论:“或许训练有素的思想家的主要特点是在证据不充分的情况下,他是...
    sxrunn阅读 1,404评论 0 1
  • 那时的阳光(三) 太阳红着脸 还没有越过土槐树的半边 地的那头,父亲正忙碌的锄地 母亲站在自家刚分的责任田这头 "...
    李家长安阅读 1,014评论 0 1
  • 只要没有特别的原因,每晚都习惯一个人在小区里散步。戴上耳机,边走边听手机里播放的优美的文章,听到动情时,会让自己来...
    花开午夜阅读 936评论 0 1
  • 对于大部分初创公司来说,创建第一个产品都是一个颇让人头疼的问题,如果我们把公司资源比喻成打猎用的弹药,那么一个初创...
    李一腾阅读 4,294评论 0 3