前言
AFNetworking和ASIHTTPRequest是iOS开发相对主流的框架,网上有很多对比的文章。
本人早在11年开始一直在使用ASI,当时非常流行,后来慢慢的开始使用AF。
如果让我新写一个项目,我会用AF,但我还是强烈建议俩者要兼顾,因为你也不知道你未来的工作项目中会用到什么。
准备
- 版本: 我建议AFnetworking 3.0
- 兼容性: iOS7+
- 传送门:github下载地址 ('or' 使用cocoapods)
基本方法
-
Manager基础设置
所有的请求方法都是AFHTTPSessionManager对象调用的,因此,我们需要做一些简单的配置 (很多默认值可以不用配置)
- (AFHTTPSessionManager *)shareAFNManager { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 超时时间 manager.requestSerializer.timeoutInterval = 30.0f; // 设置请求头 //[manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"]; // 设置接收的Content-Type manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil]; return manager; } 复制代码
注: 很多网络请求会报错,因为没有添加 @"text/plain" ,AF默认的设置里是没有这个的
-
GET请求
- (void)doGetRequest { //创建请求地址 NSString *url=@"http://120.76.205.241:8000/news/qihoo?"; //设置参数 NSDictionary *parameters=@{@"kw":@"白", @"site":@"qq.com", @"apikey":@"你的key"}; //AFN管理者调用get请求方法 [[self shareAFNManager] GET:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) { //返回请求返回进度 NSLog(@"downloadProgress-->%@",downloadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { //请求成功返回数据 根据responseSerializer 返回不同的数据格式 NSLog(@"responseObject-->%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { //请求失败 NSLog(@"error-->%@",error); }]; } 复制代码
-
POST请求
- (void)doPostRequest { //创建请求地址 NSString *url=@"http://120.76.205.241:8000/news/qihoo?"; //构造参数 NSDictionary *parameters=@{@"kw":@"白", @"site":@"qq.com", @"apikey":@"你的key"}; [[self shareAFNManager] POST:url parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { //返回请求返回进度 NSLog(@"downloadProgress-->%@",uploadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { //请求成功返回数据 根据responseSerializer 返回不同的数据格式 NSLog(@"responseObject-->%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { //请求失败 NSLog(@"error-->%@",error); }]; } 复制代码
使用技巧
由于AFHTTPSessionManager是单例的模式,
我们在APP启动后配置一次,之后通过每次初始化单例,来调用get或者post方法,显然这样的做法并不是很好。
[AFHTTPSessionManager manager]
复制代码
我建议:在AF的基础上做一层封装
- 一个Request类:
作为网络请求,里面有对Manager的配置,公共参数的判断设置等等逻辑 - 一个Respone类:
作为对于网络请求后,响应的数据,包括对Error的处理(AF的,接口返回的)等等
在后面的更新中,我会单独写一篇关于网络请求封装的文章。本篇只做基础使用的介绍。
注意:iOS9
在iOS9+的版本中,如果你的网络请求是http的,请按如下方法修改info.plist文件。
添加App Transport Security Settings (NSDictionary类型)
继续添加 key: Allow Arbitrary Loads (Boolean类型) value:YES
本篇示例代码
需要示例代码,请点我!
HeHeThirdCodeDemo 是集成了很多第三方库Demo的项目,写有大量注释,且在不断的更新维护中。有兴趣的朋友可以点击下载。
如有任何问题,可以在下方留言,我会及时解答。