因为项目中需要用到一些第三方框架来搞定基本需求,再次总结一番.我的项目是浏览器工具,所以对网络请求处理需要做很多特别处理,这也就构成了对AFN及ASI库的深究;
1.AFN全称为:AFNetWorking , 是一个构建在NSURLConnection,NSOperation以及其他熟悉的Founation技术之上的一个第三方网络框架.其对网络请求部分做了很好的封装,并且拥有良好架构,丰富的API,以及模块化构建方式;
2.AFN主要使用在2个场景中
(1):发送网络请求
(2):实时监测网络状态
AFHTTPRequestOperationManager:内部封装了NSUrlConnection,网络请求管理类,用来负责发送网络请求;
AFHTTPSessionManager :内部封装的是NSUrlSession,其内容同上,苹果推荐使用NSUrlsession;
两个网路请求管理类定义的API全完相同(此处限制于GET请求):
//⭐️NSUrlConnection--mark
[[AFHTTPRequestOperationManager manager] GET:nil parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
//⭐️NSUrlSession--mark
[[AFHTTPSessionManager manager] GET:nil parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];主要的工具类:
AFNetworkReachabilityManager.h :实时监测网络状态改变的管理类.
AFSecurityPolicy.h :HTTPS 需要使用.
AFURLRequestSerialization:数据解析的时候会使用.
AFHTTPRequestSerializer: 万能解析器/对服务器返回的数据不做任务处理.
AFJSONResponseSerializer: JSON解析器.
AFXMLParserResponseSerializer: XML解析器.
AFHTTPRequestOperationManager :对NSURLConnection的封装.
AFHTTPSessionManager :对NSURLSession的封装.
一.\AFHTTPSessionManager 用法:
创建管理者:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
设置管理者的数据解析类型,默认为json格式的解析,可手动修改为其他类型,如XML:
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
发送请求 <1.首先要明确发送的是什么类型的请求(GET/POST/HEAD...)
2. AFN3.0之后的网络接口比原来的多了一个参数-->网络进度>:
1.POST--mark
NSDictionary *dict = @{@"US":@"guerdan",@"PW":@"shushi"};
NSString * url = @"http://localhost/login/login.php";
[[AFHTTPSessionManager manager]POST:url 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);
}];
2.GET --mark
[[AFHTTPSessionManager manager] GET:url 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);
}];
参数:
URLString:网络接口地址;
Parameters:参数字典key:服务器接收普通参数的key值;
value:参数内容;
Progress:网络进度;
Success:成功回调;
Failure:失败回调;
⭐️::AFN是根据respone.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)来管理第三方框架,可以直接修改第三方框架的源代码.
一般在开发中,不要随意修改第三方源码.☔️☔️☔️
二\.AFHTTPRequestOperationManager -->省略啦~~
对服务器返回数据的解析: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.waring
服务器返回的数据一定要跟ResponeSerializer对的上
三\.实时监测网络状态:
可以利用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 网络安全传输协议下的访问
什么是HTTPS:
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;
☀️☀️☀️
五\.AFN和ASI的区别
1--首先对比两者的底层实现:
(1).AFN的底层基于OC的NSURLConnection和NSURLSesson
(2).ASI的底层则是基于纯C语言的CFNetWork框架
(3).ASI的运行性能要高于AFN
2--对服务器返回的数据处理:
(1).ASI没有直接提供对服务器数据处理的方式,直接返回data\string
(2).AFN提供了多种对服务数据的处理的方式
--mark JSON处理;
--mark XML处理;
--mark 其他处理;
3--监听请求的过程
(1).AFN提供了success和failure两个block来监听请求的过程(3.0之前只能监听成功和失败~~;3.0之后添加了进度)
--mark success:请求成功后调用
--mark failure:请求失败后调用
(2).ASI提供了3套方案,每一套方案都能监听请求的完整过程 -->(监听请求开始,接收到响应头信息,接收到具体数据,接收完毕,请求失败/成功)
--mark 成为代理.遵守协议,实现协议中的代理方法
--mark 成为代理,不遵守协议,自定义代理方法
--mark 设置block
3--文件下载和文件上传的使用难易程度
(1).AFN
--mark 不容易监听下载进度和上传进度
--mark 不容易实现断点续传
--mark 一般只用来下载不大的文件
(2).ASI
--mark 容易实现上传和下载
--mark 容易监听下载上传进度
--mark 容易实现断点续传
--mark 下载大文件/小文件都行
PS:ASI提供了更多的使用功能
(1):控制请求动画是否在请求过程中转;
(2):可以轻松设置请求之间的依赖:诶一个请求都是一个NSOperation对象
(3):可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理多有的请求对象)
--mark 暂停\恢复\取消所有的请求
--mark 监听整个队列中所有请求的下载/上传 进度