本篇将从四个方面对iOS开发中常用到的AFNetworking框架进行讲解:javascript
1、什么是 AFN
2、为何要使用 AFN
3、AFN 怎么用
3、AFN和ASI的区别
AFN 全称为 AFNetworking,是一个构建与在 NSURLConnection、NSOperation 以及其余熟悉的 Founation 技术之上的一个第三方网络框架。php
AFN 对网络请求部分作了很好的封装,而且拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来很是轻松.。java
AFN 主要使用在2个场景中:json
1、发送网络请求api
2、实时监测网络状态安全
AFHTTPRequestOperationManager:内部封装的是 NSUrlConnection,网络请求管理类,用来负责发送网络请求,是使用最多的一个类.服务器
AFHTTPSessionManager :内部封装的是 NSUrlSession,网络请求管理类,用来负责发送网络请求,是使用作多的一个类.网络
两个网络请求管理类定义的 API 彻底相同:架构
[[AFHTTPRequestOperationManager manager] GET:nil parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { // } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // }]; [[AFHTTPSessionManager manager] GET:nil parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { // } failure:^(NSURLSessionDataTask *task, NSError *error) { // }];
一些主要的工具类:app
AFNetworkReachabilityManager.h :实时监测网络状态改变的管理类.
AFSecurityPolicy.h :HTTPS 须要使用.
AFURLRequestSerialization: 数据解析的时候会使用.
AFHTTPRequestSerializer: 万能解析器/对服务器返回的数据不作任务处理.
AFJSONResponseSerializer: JSON解析器.
AFXMLParserResponseSerializer: XML解析器.
AFHTTPRequestOperationManager 对NSURLConnection的封装.
AFHTTPSessionManager 对NSURLSession的封装.
1.建立管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
2.设置管理者的数据解析类型,默认为 json 格式的解析,可手动修改成其余类型,如 XML:
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
3.发送网络请求
NSDictionary *dict = @{@"username":@"zhangsan",@"password":@"zhang"}; [[AFHTTPSessionManager manager] POST:@"http://localhost/login/login.php" parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) { // } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // NSLog(@"responseObject:%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // NSLog(@"error:%@",error); }]; [[AFHTTPSessionManager manager] GET:@"http://localhost/login/login.php" parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) { NSLog(@"下载进度:%@",downloadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"responseObject:%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"error:%@",error); }];
3.1 首先要明确发送的是什么类型的请求(GET/POST/HEAD...)
3.2 AFN 3.0以后的网络接口相比以前的网络接口多了一个参数:网络进度.
参数:
1. urlString: 网络接口地址.
2. parameters: 参数字典.key:服务器接收普通参数的key值,value就是参数内容.
3. progress: 网络进度
4. success: 成功回调
5. failure: 失败回调
3.3 AFN根据 response.MIMEType 来判断服务器返回数据的类型. 若是类型不匹配,可是又是JSON数据,解决方案:
1.改变解析器类型为:万能解析器 ---> 手动解析JSON
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
2.改变判断条件的类型,以使类型匹配,acceptableContentTypes默认状况下无 text/plain 类型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/plain",nil];
注: 若是没有使用第三方框架(CocoaPods)来管理第三方框架,能够直接修改第三方框架的源代码.
通常在开发中,不要随意修改第三方源码.
1.建立管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
2.封装请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"username"] = @"哈哈哈"; params[@"pwd"] = @"123";
3.发送请求
NSString *url = @"http://localhost:8080/Server/login"; [mgr POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { // 请求成功的时候调用这个block NSLog(@"请求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 请求失败的时候调用调用这个block NSLog(@"请求失败"); }]; // GET请求 [mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { // 请求成功的时候调用这个block NSLog(@"请求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 请求失败的时候调用调用这个block NSLog(@"请求失败"); }];
1.AFN能够自动对服务器返回的数据进行解析
* 默认将服务器返回的数据当作JSON来解析
2.设置对服务器返回数据的解析方式
1> 当作是JSON来解析(默认作法)
* mgr.responseSerializer = [AFJSONResponseSerializer serializer];
* responseObject的类型是NSDictionary或者NSArray
2> 当作是XML来解析
* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
* responseObject的类型是NSXMLParser
3> 直接返回data
* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data便可
* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
3.注意
* 服务器返回的数据必定要跟responseSerializer对得上
1> 服务器返回的是JSON数据
* AFJSONResponseSerializer
* AFHTTPResponseSerializer
2> 服务器返回的是XML数据
* AFXMLParserResponseSerializer
* AFHTTPResponseSerializer
3> 服务器返回的是其余数据
* AFHTTPResponseSerializer
可利用 AFN 实时监测网络状态.
AFNetworkReachabilityManager 实时检测网络状态改变的类 AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; // 设置网络状态改变以后的操做 [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { // status :当前的网络状态. // AFNetworkReachabilityStatusUnknown // AFNetworkReachabilityStatusNotReachable // AFNetworkReachabilityStatusReachableViaWWAN // AFNetworkReachabilityStatusReachableViaWiFi switch (status) { case AFNetworkReachabilityStatusUnknown: NSLog(@"未知的网络状态"); break; case AFNetworkReachabilityStatusNotReachable: NSLog(@"没有网络"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"蜂窝移动网络"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WIFI网络"); break; default: break; } }]; // 开始检测网络状态 [manager startMonitoring];
HTTPS = HTTP(超文本传输协议) + SSL (安全链接层) HTTP 的安全版本.
HTTPS 会专门创建一个 安全的数据传输通道来传输数据,外界拿不到任何数据,现阶段最安全的协议,目前在 http 模式下三大运营商发送的恶意广告泛滥,而且能够得到用户的我的信息,知乎有专门文章讲解如何到工信部投诉的内容。
HTTPS 须要数字验证,目前不少大公司使用的数字验证都是默认支持的.
[manager GET:@"https://mail.itcast.cn" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) { // } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSData *data = responseObject; // NSLog(@"成功:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // NSLog(@"失败:%@",error); }];
AFN 默认状况下就是支持 HTTPS 访问的,可是若是用 HTTPS 的方式访问未受信任的网站便会报错,解决方案:
修改对 SSL 的检测:
AFN3.0以前:
manager.securityPolicy.allowInvalidCertificates = YES;
AFN3.0以后:
manager.securityPolicy.validatesDomainName = NO;
1、底层实现
1> AFN的底层基于OC的NSURLConnection和NSURLSession
2> ASI的底层基于纯C语言的CFNetwork框架
3> ASI的运行性能 高于 AFN
2、对服务器返回的数据处理
1> ASI没有直接提供对服务器数据处理的方式,直接返回data\string
2> AFN提供了多种对服务器数据处理的方式
* JSON处理
* XML处理
* 其余处理
3、监听请求的过程
1> AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败)(3.0之后添加了进度)
* success : 请求成功后调用
* failure : 请求失败后调用
2> ASI提供了3套方案,每一套方案都能监听请求的完整过程
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
* 成为代理,遵照协议,实现协议中的代理方法
* 成为代理,不遵照协议,自定义代理方法
* 设置block
4、在文件下载和文件上传的使用难易度
1> AFN
* 不容易监听下载进度和上传进度
* 不容易实现断点续传
* 通常只用来下载不大的文件
2> ASI
* 很是容易实现下载和上传
* 很是容易监听下载进度和上传进度
* 很是容易实现断点续传
* 下载或大或小的文件都行
5、ASI提供了更多的实用功能
1> 控制圈圈要不要在请求过程当中转
2> 能够轻松地设置请求之间的依赖:每个请求都是一个NSOperation对象
3> 能够统一管理全部请求(还专门提供了一个叫作ASINetworkQueue来管理全部的请求对象)
* 暂停\恢复\取消全部的请求
* 监听整个队列中全部请求的下载进度和上传进度