AFNetworking是iOS开发中最常用的一种网络请求三方库,但是通常使用时都会对其再封装一层来使用,可以降低代码的耦合度。
和GET差不多,只是使用了manager的POST方法
创建类HttpManager HttpManager.h
#import <Foundation/Foundation.h> //HttpConstant是存放网络接口宏定义的.h文件 #import "HttpConstant.h" @class UIImage; ///Block postResult typedef void (^ResultPost)(NSString *result,NSError *error);//result:网络数据 ///Block getResult typedef 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; @endHttpManager.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); }]; }以登录模块为例子,创建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; @endLoginManager.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作者的话:干iOS开发也快有两年了,一直都是看别人的微博,这是我写的第一篇微博,复习自己的知识同时也作出一点点回报。
