iOS常用三方库 AFNetworking及封装

来源:互联网 发布:svd矩阵标准化 编辑:程序博客网 时间:2024/06/05 03:53

介绍

AFNetworking是iOS开发中最常用的一种网络请求三方库,但是通常使用时都会对其再封装一层来使用,可以降低代码的耦合度。

使用方法

1.GET请求

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer = [AFHTTPRequestSerializer serializer];manager.responseSerializer = [AFHTTPResponseSerializer serializer];[manager GET:apiURL parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) {     //加载进度    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject){     //请求成功       NSDictionary *resultDic;    @try    {    resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];    //然后对resultDic进行处理    }@catch (NSException * e) {        //返回的数据格式不是json    }} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {     //请求失败}];

2.POST方法

和GET差不多,只是使用了manager的POST方法

3.上传图片到服务器

 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager POST:apiURL parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];        formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";        NSString *fileName = [formatter stringFromDate:[NSDate date]];        //image为你要上传到服务器的图片        if (image!=nil) {            UIImage *aImage = image;            //0.3为图片的压缩倍率            [formData appendPartWithFileData:UIImageJPEGRepresentation(aImage,0.3) name:@"res1.jpg" fileName:fileName mimeType:@"image/jpeg"];        }    } progress:^(NSProgress * _Nonnull uploadProgress) {    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {         //请求成功           NSDictionary *resultDic;        @try        {            resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];        //然后对resultDic进行处理        }@catch (NSException * e) {            //返回的数据格式不是json        }    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {      //请求失败    }];

封装

1.对AFNetworking封装

创建类HttpManager
HttpManager.h

#import <Foundation/Foundation.h>//HttpConstant是存放网络接口宏定义的.h文件#import "HttpConstant.h"@class UIImage;///Block postResulttypedef void (^ResultPost)(NSString *result,NSError *error);//result:网络数据///Block getResulttypedef void (^ResultGet)(NSString *result,NSError *error);@interface HttpManager : NSObject+ (HttpManager *)sharedHttpManager;//api:接口 dic:参数 resultPost:带有数据的block参数- (void) setPostURL:(NSString *)api dic:(NSDictionary *)dic blockPostResult:(ResultPost)resultPost;- (void) setGetURL:(NSString *)api dic:(NSDictionary *)dic blockGetResult:(ResultGet)resultGet;- (void) setPostUpload:(NSString *)api image:(UIImage *)image url:(NSURL*)fileURL blockPostResult:(ResultPost)resultPost;@end

HttpManager.m

#import "HttpManager.h"@implementation HttpManager+ (HttpManager *) sharedHttpManager{    static HttpManager *sharedAccountManagerInstance = nil;    static dispatch_once_t predicate;    dispatch_once(&predicate, ^{        sharedAccountManagerInstance = [[self alloc] init];    });    return sharedAccountManagerInstance;}- (void)setGetURL:(NSString *)api dic:(NSDictionary *)dic blockGetResult:(ResultGet)resultGet{    NSString *apiURL = [NSString stringWithFormat:@"%@%@",BASEURL,api];    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    manager.requestSerializer = [AFHTTPRequestSerializer serializer];    manager.responseSerializer = [AFHTTPResponseSerializer serializer];    NSDictionary *dict = dic;    [manager.requestSerializer setHTTPShouldHandleCookies:YES];    NSArray * cookieArr = [Common getCookies];    for (NSHTTPCookie * cookie in cookieArr) {        [manager.requestSerializer setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie"];    }    [manager GET:apiURL parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) {    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];        resultGet(result,nil);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        resultGet(nil,error);    }];}- (void) setPostURL:(NSString *)api dic:(NSDictionary *)dic blockPostResult:(ResultPost)resultPost{    NSString *apiURL = [NSString stringWithFormat:@"%@%@",BASEURL,api];    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    manager.requestSerializer = [AFHTTPRequestSerializer serializer];    manager.responseSerializer = [AFHTTPResponseSerializer serializer];    NSDictionary *dict = dic;    [manager.requestSerializer setHTTPShouldHandleCookies:YES];    NSArray * cookieArr = [Common getCookies];    for (NSHTTPCookie * cookie in cookieArr) {        [manager.requestSerializer setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie"];    }    [manager POST:apiURL parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) {    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];        NSLog(@"%@",result);        resultPost(result,nil);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        resultPost(nil,error);    }];}#pragma mark - POST上传/** * * *  @param api        <#api description#> *  @param image      <#image description#> *  @param fileURL   <#fileURL2 description#> *  @param resultPost <#resultPost description#> */- (void) setPostUpload:(NSString *)api image:(UIImage *)image url:(NSURL*)fileURL blockPostResult:(ResultPost)resultPost{    NSString *apiURL = [NSString stringWithFormat:@"%@%@",BASEURL,api];    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    manager.requestSerializer = [AFHTTPRequestSerializer serializer];    manager.responseSerializer = [AFHTTPResponseSerializer serializer];    [manager.requestSerializer setHTTPShouldHandleCookies:YES];    NSArray * cookieArr = [Common getCookies];    for (NSHTTPCookie * cookie in cookieArr) {        [manager.requestSerializer setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie"];    }    [manager POST:apiURL parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];        formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";        NSString *fileName = [formatter stringFromDate:[NSDate date]];        if (image!=nil) {            UIImage *aImage = image;            [formData appendPartWithFileData:UIImageJPEGRepresentation(aImage,0.3) name:@"res1.jpg" fileName:fileName mimeType:@"image/jpeg"];        }        else        {            NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"Tantor.png" withExtension:nil];            [formData appendPartWithFileURL:fileURL name:@"Tantor" fileName:fileName mimeType:@"image/png" error:NULL];        }    } progress:^(NSProgress * _Nonnull uploadProgress) {    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];        resultPost(result,nil);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {         resultPost(nil,error);    }];}

2.根据项目的模块进行网络封装

以登录模块为例子,创建LoginManager继承HttpManager
LoginManager.h

#import <Foundation/Foundation.h>//网络数据所有model的.h文件#import "LoginModelHeader.h"//model是获取的网络数据model result为返回错误时要弹窗的信息  error为网络错误typedef void(^Result)(id model,NSString *result,NSError *error);@interface LoginManager : NSObject+ (LoginManager *)sharedManager;#pragma mark - 接口API//登录- (void)LoginManagerLoginWithName:(NSString *)userName password:(NSString *)password login_type:(NSString *)login_type blockResult:(Result)result;@end

LoginManager.m

#import "LoginManager.h"#import "HttpManager.h"#define CustomErrorDomain @"com.mykar.test"typedef enum {    GOErrorDefultFailed     = -10000,    GoErrorJSONFormatError  = -10001,    GoErrorRetCodeError     = -10002,    GoErrorContentError     = -10003,}GOErrorFailed;@interface LoginManager (){    HttpManager * _httpManager;}@end@implementation LoginManager+ (LoginManager *)sharedManager{    static LoginManager *sharedManagerInstance = nil;    static dispatch_once_t predicate;    dispatch_once(&predicate, ^{        sharedManagerInstance = [[self alloc] init];    });    return sharedManagerInstance;}- (instancetype) init{    if ([super init]) {        _httpManager = [HttpManager sharedHttpManager];    }    return self;}#pragma mark - 接口API- (void)LoginManagerLoginWithName:(NSString *)userName password:(NSString *)password login_type:(NSString *)login_type blockResult:(Result)login_result{    NSDictionary * dict = @{@"mobile":userName,@"password":password,@"type":login_type};    weakSelf(self);    [_httpManager setPostURL:URL_LOGIN dic:dict blockPostResult:^(NSString *result, NSError *error)     {        BOOL temp = [weakSelf checkDict:result AndBlock:login_result AndError:error];         if (!temp) {             return ;         }        NSData *responseObject = [result dataUsingEncoding:NSUTF8StringEncoding];        NSDictionary * resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];        N_UserinfoModel * model = [N_UserinfoModel mj_objectWithKeyValues:H_NSNullToNil([resultDic[@"data"] objectForKey:@"userinfo"])];        login_result(model,nil,nil);    }];}#pragma mark - help-(BOOL)checkDict:(NSString *)result  AndBlock:(Result)login_result   AndError:(NSError*)error{    if(error){        NSDictionary *userInfo = [NSDictionary dictionaryWithObject:error.localizedDescription                                                                      forKey:NSLocalizedDescriptionKey];        NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:GOErrorDefultFailed userInfo:userInfo];        login_result(nil,nil,aError);        return NO;    }    NSData *responseObject = [result dataUsingEncoding:NSUTF8StringEncoding];    NSDictionary *resultDic;    @try    {        resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];    }@catch (NSException * e) {        NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"返回格式非json"                                                                      forKey:NSLocalizedDescriptionKey];        NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:GoErrorJSONFormatError userInfo:userInfo];        login_result(nil,@"返回格式非json",aError);        return NO;    }    NSString *retCode = [resultDic objectForKey:@"ret"];    if (retCode.intValue != 0) {        NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"retCode Error"                                                                      forKey:NSLocalizedDescriptionKey];        NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:GoErrorRetCodeError userInfo:userInfo];        login_result(nil,[resultDic objectForKey:@"msg"],aError);        return NO;    }    return YES;}@end

3.使用LoginManager

- (void)viewDidLoad {    [super viewDidLoad];    [[LoginManager sharedManager] LoginManagerLoginWithName:@"***" password:@"***" login_type:@"1" blockResult:^(id model, NSString *result, NSError *error) {        if (result) {            [SVProgressHUD showErrorWithStatus:result];        }else        {            N_UserinfoModel * userinfo = (N_UserinfoModel *)model;        }    }];}

作者的话:干iOS开发也快有两年了,一直都是看别人的微博,这是我写的第一篇微博,复习自己的知识同时也作出一点点回报。

0 0