![](https://img.haomeiwen.com/i2279791/b5902a178d313eee.png)
前言
AFNetworking 是 Objective-C 语言编写的一套简单易用的网络请求库,本库让开发者不需要编写繁琐的网络框架代码就可以完成一次网络请求。AFNetworking 默认提供GET
、POST
、PUT
、HEAD
、PATCH
、DELETE
这几种请求方式。简单调用如下:
[[AFHTTPSessionManager manager] GET:@"request url" parameters:@{@"key1":@"value1"} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failed");
}];
今天我们就来看下 AFNetworking 内部是如何实现的。
实现步骤
简单的流程图如下:
![](https://img.haomeiwen.com/i2279791/cec810ec538eae6d.png)
下面我们详细看一下每个步骤的具体实现是怎样的:
初始化Manager
在这个步骤中主要是初始化各种设置,例如
- sessionConfiguration session的配置信息,使用默认或者按照需求配置
- operationQueue 处理返回值的队列,默认为主线程。同时会设置同时最大处理线程数(同时可以执行几个线程)
- responseSerializer 返回结果的序列化相关配置,常见的问题是在服务端的接口返回信息的 ContentTypes 不符合库的要求,导致无法解析。acceptableContentTypes 字段配置了 AFNetworking 可以解析的格式,如果有需要可以自行添加支持的格式
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
- securityPolicy 安全策略的配置,如果本地有HTTPS证书之类的东西话话,需要设置相应的值。
- reachabilityManager 网络状态检查,用于检查当前的网络状态,根据不同的网络状态可能需要修改网络请求的具体参数。
创建 Request
通过 RequestSerializer 类来创建Request,其中主要是设置header信息和根据不同的请求方式对参数做不同的处理。
创建 DataTask
在这个步骤中,只要调用系统的dataTaskWithRequest
方法来创建Task,并设置Task的代理方法。
调用Resume
由于是异步请求,所以在创建完Task之后,直接调用Resume方法。
处理请求结果
等待请求完成方法回调 URLSession: task:didCompleteWithError:
,回调这个方法的时候,说明请求已经结束了。所以在这个方法里面做返回信息的处理。除了添加一些公共辅助信息之外,最主要的是解析返回信息的JSON串
。根据返回是否有错误来决定是否解析返回信息
- 如果有 error,则不解析返回信息
- 如果没有 error,则根据 responseSerializer 的配置解析返回信息。
调用相应的Block返回
上一步组装完具体返回信息之后,根据是否自定义了 completionGroup 和 completionQueue 来确定 dispatch_async 的参数并调用Block返回。同时需要发送请求完成的通知。
在以上的步骤中,任何一步出现 Error 都会中断请求并直接返回错误信息。
补充
RequestSerializer
用来生成 Request类,主要封装了超时时间,header设置,缓存策略,编码等信息。
ResponseSerializer
用来解析接口返回信息,例如JSON串或者图片信息等。其中定义了可解析的内容格式为application/xml
、text/xml
。由于 AFNetworking 的定位问题,所以这里没有对其他内容格式做兼容并且没有提供自定义的入口,如果需要兼容其他格式(例如text/html
等),就需要使用者自己到这个地方修改。
securityPolicy
如果本地需要验证证书,需要在初始化的时候做证书设置,主要是指定验证的模式
- AFSSLPinningModeNone 无条件信任服务端的证书
- AFSSLPinningModePublicKey 验证 publicKey
- AFSSLPinningModeCertificate 验证整个证书
然后我们需要验证的证书放在项目中就可以了。AFNetworking 会在初始化的时候去项目中查找所有.cer
结尾的文件放在证书列表中并提取PublicKey
。在需要验证的时候一一验证。
在URLSession的回调方法URLSession:didReceiveChallenge:completionHandler:
中验证证书是否有效。
最后
AFNetworking 是一个非常优秀的网络请求库,为我们减少了很多工作量,我们不需要做很多学习就可以使用。但是由于定位原因,所以该库并没有把许多设置开放出来(例如自定义返回格式等)。
欢迎斧正。
网友评论