基于AFNetworking封装的HttpsRequest类

首先说明下为什么要自己封装一层这个类,因为项目需要,不同的接口实现不同的通信协议,所以自己封装了一层来控制相关的类来处理一些操作!比如Get、Post、Put、Delete...
这个类也是主要封装了以上几个方法!

—————————————————————————————————————————————————————————————
我用了cocoaPods来管理AFNetworking。这个应该不用再说明怎么导入使用这个类库了吧!
这里面还用到了UICKeyChainStore这个存储信息的第三方类
PDToast 还用了我自己写的的一个动态库PDFramework里面的一个功能
http://www.jianshu.com/writer#/notebooks/5366058/notes/4998769
—————————————————————————————————————————————————————————————
下面来说重点:

HttpsRequest.h

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

@interface HttpsRequest : NSObject

+(HttpsRequest *)getInstance;

- (void)GetData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

- (void)PostData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

- (void)PUTData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

- (void)DeleteData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

@property (nonatomic, retain) UIView *selfView;

@end
HttpsRequest.m

#import "HttpsRequest.h"
#import <AFNetworking.h>
#import <CommonCrypto/CommonDigest.h>
#import "General.h"//这个是写配置的文件(这个文件里面写了一些宏定义,如果你需要直接使用这两个类的话,拷贝代码报警告或者错误的话,自行修改错误的地方吧!)

@implementation HttpsRequest

static AFHTTPSessionManager *manager;
static HttpsRequest *httpsRequest;
NSString *MyUrl;
NSMutableDictionary *Mydic;
UIView  *errorView;

+(instancetype)getInstance
{
    if (httpsRequest ==nil) {
        httpsRequest = [[HttpsRequest alloc]init];
    }
    
    
    if (manager ==nil) {
        manager = [AFHTTPSessionManager  manager];
    }
    
    
    return httpsRequest;
}

- (instancetype)init
{
    self = [super init];
    return self;
}

- (void)GetData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    if (params == nil) {
        params = [NSMutableDictionary new];
    }
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    
    [manager GET:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //        NSLog(@"请求成功:%@", responseObject);
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
        
    }];
    

    
    
}
- (void)PostData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    if (params == nil) {
        params = [NSMutableDictionary new];
    }
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
 
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    else
    {
        [manager.requestSerializer setValue:nil forHTTPHeaderField:@"sid"];
    }

    [manager POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //        NSLog(@"请求成功:%@", responseObject);
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
        
    }];
    

    
}

- (void)PUTData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    //[manager.requestSerializer setValue:@"text/html;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
    
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    [manager PUT:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
    }];
    
    
}

- (void)DeleteData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//    [manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    [manager DELETE:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
    }];
    
    
    
}

#pragma mark 类方法

- (NSString*)sha1:(NSString*)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, (unsigned)(long)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
    
}

- (void)showErrorInfo:(NSInteger )errorCode :(NSDictionary *)parms :(NSString *)url
{
    switch (errorCode) {
        case 0:
            NSLog(@"");
            break;
        case 1001:
//            [PDToast showWithText: @"系统异常,请重新登录" bottomOffset:80];
            break;
        case 2001:
            [PDToast showWithText: @"系统异常,请稍候重试" bottomOffset:80];
            break;
            
        case 4001:
            [PDToast showWithText: @"验证码错误" bottomOffset:80];
            break;
            
        case 4002:
            [PDToast showWithText: @"验证码过期" bottomOffset:80];
            break;
            
        case 4003:
            [PDToast showWithText: @"抵扣的积分超过允许上限" bottomOffset:80];
            break;
            
        case 4004:
            [PDToast showWithText: @"没有足够的积分用来抵扣" bottomOffset:80];
            break;
            
        case 4005:
            [PDToast showWithText: @"找不到用户" bottomOffset:80];
            break;
            
        case 4006:
            [PDToast showWithText: @"找不到商品" bottomOffset:80];
            break;
            
        case 4007:
            [PDToast showWithText: @"已经支付的订单不能取消" bottomOffset:80];
            break;
            
        case 4008:
            [PDToast showWithText: @"没有积分可以赠送" bottomOffset:80];
            break;
            
        case 4009:
            [PDToast showWithText: @"领取积分失败" bottomOffset:80];
            break;
            
        case 4010:
            [PDToast showWithText: @"积分点为0" bottomOffset:80];
            break;
            
        case 4011:
            [PDToast showWithText: @"余额转出申请已经处理过了" bottomOffset:80];
            break;
            
        case 4012:
            [PDToast showWithText: @"账户金额不足" bottomOffset:80];
            break;
            
        case 4013:
            [PDToast showWithText: @"请不要重复申请" bottomOffset:180];
            break;
        case 4014:
            [PDToast showWithText: @"请不要重复注册" bottomOffset:80];
            break;
        case 4015:
            [PDToast showWithText: @"密码错误" bottomOffset:80];
            break;
            
        case 4016:
            [PDToast showWithText: @"推荐商户数不够,申请客户经理失败" bottomOffset:80];
            break;
        case 4017:
            [PDToast showWithText: @"当前时间段不能领积分" bottomOffset:80];
            break;
        case 4018:
            [PDToast showWithText: @"不能自己做积分兑换" bottomOffset:80];
            break;
        case 4019:
            [PDToast showWithText: @"申请已经处理过了" bottomOffset:80];
            break;
        case 4020:
            [PDToast showWithText: @"该区域已经有区域经理了" bottomOffset:80];
            break;
        case 4021:
            [PDToast showWithText: @"此手机号码不是商户" bottomOffset:80];
            break;
        case 4022:
            [PDToast showWithText: @"该区域已经有区域经理了" bottomOffset:80];
            break;
        case 4023:
            [PDToast showWithText: @"此用户已经是区域经理/客户经理" bottomOffset:80];
            break;
        case 4024:
            [PDToast showWithText: @"手动领取积分功能还未开放" bottomOffset:80];
            break;
        case 4025:
            [PDToast showWithText: @"获取验证码太频繁" bottomOffset:80];
            break;
        case 4026:
            [PDToast showWithText: @"工资还未算出,不能查看" bottomOffset:80];
            break;
        case 4027:
            [PDToast showWithText: @"当月工资已经支付过了" bottomOffset:80];
            break;
        default:
            break;
    }
}

基于这个类上面再次封装了一个Server类 专门处理接口的请求数据

Server0.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "HttpsRequest.h"


@interface Server0 : NSObject
+ (Server0 *)getInstance;
- (void)Register:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block;
- (void)Login:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block;
@end

#import "Server0.h"

@implementation Server0

+(instancetype)getInstance
{
    static Server0 *server;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        server = [[Server0 alloc] init];
    });
    return server;
}

- (instancetype)init
{
    self = [super init];
    
    return self;
}

- (void)Register:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block{
    //接口名
    NSString *str = @"/user/register";
    //Url
    NSString *url = [NSString stringWithFormat:@"%@%@",NewReleaseURL,str];
    
    //数据请求
    [HttpsRequest getInstance].selfView = SelfView;
    [[HttpsRequest getInstance] PUTData:dic :url andBlock:^(id requestStr) {
        if ([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"error"] || [[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"0"] ) {
            block(0);
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"1024"])
        {
            block(@"1024");
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"2048"])
        {
            block(@"2048");
            return;
        }
        else
        {
             NSLog(@"%@",requestStr);
            block(requestStr);
        }
    }];

    
}

- (void)Login:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block{
    
    //接口名
    NSString *str = @"/user/login";
    //Url
    NSString *url = [NSString stringWithFormat:@"%@%@",NewReleaseURL,str];
  
    //数据请求
    [HttpsRequest getInstance].selfView = SelfView;
    [[HttpsRequest getInstance] PostData:dic :url andBlock:^(id requestStr) {
        if ([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"error"] || [[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"0"] ) {
            block(0);
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"1024"])
        {
            block(@"1024");
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"2048"])
        {
            block(@"2048");
            return;
        }
        else
        {
            NSLog(@"%@",requestStr);
            block(requestStr);
        }
    }];
    
}
@end

下面是具体的使用方法
Viewcontroller.m里面具体使用

#import "Server0.h"

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    //登录
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
    [dic setObject:@"123456789" forKey:@"mobile"];
    [dic setObject:@"123456" forKey:@"captcha"];
    [self getLogin:dic];
    
    //注册
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
    [dic setObject:@"123456" forKey:@"mobile"];
    [dic setObject:@"123" forKey:@"captcha"];
    [dic setObject:@"123455"forKey:@"referrerMobile"];
    [self getRegister:dic];
    NSLog(@"%@ %@",phone,verCode);
    
  
}


- (void)getLogin:(NSMutableDictionary *)dic{
    
    [[Server0 getInstance] Login:self.view :dic :^(id requsetStr) {
        if (requsetStr == 0)
        {
            
        }
        else
        {
            
            NSLog(@"%@",requsetStr);

            [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"flag"]] forKey:@"flag" service:keychainValue];
            [UICKeyChainStore setData:requsetStr[@"pages"] forKey:@"pages" service:keychainValue];
            [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"sessionID"]] forKey:@"sessionID" service:keychainValue];
            [UICKeyChainStore setString:@"LoginSucceed" forKey:@"Login" service:keychainValue];

        }
    }];
}

- (void)getRegister:(NSMutableDictionary *)dic{
        //dic为入参的参数结构体
        
        [[Server0 getInstance] Register:self.view :dic :^(id requsetStr) {
            if (requsetStr == 0)
            {
                
            }
            else
            {
                
                NSLog(@"%@",requsetStr);
                [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"flag"]] forKey:@"flag" service:keychainValue];
                [UICKeyChainStore setData:requsetStr[@"pages"] forKey:@"pages" service:keychainValue];
                [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"sessionID"]] forKey:@"sessionID" service:keychainValue];
                [UICKeyChainStore setString:@"LoginSucceed" forKey:@"Login" service:keychainValue];

            }
        }];
}


这里我只列出了几个常用的方法,具体数据处理还要看自己对应的需求
requsetStr我自己做了一点处理 请求数据返回的数据里面如果有data为key的数据,会自动解析返回data对应的value值,所以requsetStr不同的接口返回的可能是字典也可能是数组!
如果大家有什么看不明白的地方可以留言给我!空一点我会写一个demo放到我的github上去!可能会更详细!

感谢大家的支持,我会继续努力为大家带来更多更好的开发上面的分享!

推荐阅读更多精彩内容