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
- iOS常用三方库 AFNetworking及封装
- iOS 对afnetworking简单封装
- iOS AFNETWorkIng的封装类
- AFNetworking原理及常用操作
- AFNetworking原理及常用操作
- AFNetworking原理及常用操作
- AFNetworking原理及常用操作
- iOS-- 对AFNetWorking库的进一步封装
- iOS AFNetworking 3.0二次封装(一)
- iOS-利用Block二次封装AFNetworking 3.0
- iOS开发AFNetworking的再次封装
- iOS开发:对AFNetworking进行封装
- iOS 数据请求类AFNetworking 简单封装
- iOS-AFNetworking 封装(自定义版)
- iOS AFNetworking封装的网络请求
- IOS AFNetworking各种功能封装类
- AFNetworking GET 请求 方法封装及调用
- AFNetWorking使用及二次封装的好处
- 程序设计2
- Spring基础
- 利用nodeJs anywhere搭建本地服务器环境
- Android Studio手动下载配置Gradle的方法
- Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍
- iOS常用三方库 AFNetworking及封装
- CSS样式优先级(权值)
- 在strut 2中使用拦截器(interceptor)控制登录和权限
- IOS type="search"
- 数据迁移 三步走
- Google推荐的图片加载库Glide介绍
- React Native 之组件react-native-sound的使用
- linux 大量的TIME_WAIT解决办法
- matlab概率及数理统计学习-T检验、卡方检验、直方图分布检验