前言
学习了Mananger的初始化和以GET请求为例的过程,发现整个过程离不开AFHTTPSessionManager和AFURLSessionManger的某些方法。这两个是AFN的重要的网络通信模块内容,对它们作揖详细的学习。
AFURLSessionManager
和AFHTTPSessionManager
都是AFNetworking
库中的两个类,用于处理网络请求和会话管理
如果只涉及到HTTP请求,一般会直接使用AFHTTPSessionManager
进行操作。而AFURLSessionManager
则提供了更底层的接口,适用于特定的定制需求或与NSURLSession
相关的操作
1.1 AFURLSessionManger和AFHTTPSessionManager的关系
图解
首先AFURLSessionManger
是AFHTTPSessionManager
的父类,其中AFURLSessionManger
内部还包含AFURLSessionManagerTaskDelegate
和_AFURLSessionTaskSwizzling
;
AFHTTPSessionManager
本身是对网络请求做了一些简单的封装,请求的整个逻辑是分发给AFURLSessionManager或者其他类去做的;其内部管理自己的两种序列化工具,用来对请求和响应的数据做序列化;同时依赖于父类提供的保证安全,监控网络状态,实现发出HTTP请求的核心功能;
AFHTTPSessionManager
也可以是AFURLSessionManager
的基础上进一步封装,专门用于处理基于HTTP协议的网络请求,提供了更方便的HTTP请求方法和相关功能,如GET、POST等常见的HTTP方法,以及请求参数的设置、请求头的配置、数据解析等功能
1.2 AFURLSessionManager
1.2.1 AFURLSessionManger功能
AFURLSessionManager
负责生成对应的NSURLSession
的实例,管理AFNetworkReachabilityManager
和AFSecurityPolicy
,以此一来查看网络的连接情况,二来保证请求的安全,同时初始化生成一个AFJSONResponseSerializer的实例来序列化HTTP的响应结果;
遵守的协议
- 点击发现他遵守了很多的协议
除此之外还提供了属性和方法用来完成其功能
关键属性
@property (nonatomic, strong) id <AFURLResponseSerialization> responseSerializer;
// 响应序列化
// SSL的安全策略
@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
/// 网络监控
@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager;
概览
核心方法就是生成一个AFURLSessionManager的实例对象,上文在以GET请求为例的时候介绍了dataTaskWithRequest
,其实还有uploadTaskWithRequest和 downloadTaskWithRequest和downloadTaskWithResumeData
uploadTaskWithRequest
点击发现uploadTaskWithRequest
存在三个不同的请求方法
- uploadTaskWithRequest:(NSURLRequest *)requestfromFile
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)requestfromData
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest
/// 使用本地的文件请求创建一个NSURLSessionUploadTask
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
fromFile:(NSURL *)fileURL
progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
{
/// 它调用了request和本地的文件URL路径创建了一个uploadTask
NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL];
/// 为该uploadTask太溺爱对应的代理 addDelegateForUploadTask
if (uploadTask) {
[self addDelegateForUploadTask:uploadTask
progress:uploadProgressBlock
completionHandler:completionHandler];
}
return uploadTask;
}
/// 根据指定的HTTP Body请求创建URLSessionUploadTask
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
fromData:(NSData *)bodyData
progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
{
NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData];
[self addDelegateForUploadTask:uploadTask progress:uploadProgressBlock completionHandler:completionHandler];
return uploadTask;
}
/// AFURLSessionManager的一个方法,用于创建一个基于流的上传任务。具体参数说明如下:
/// request:上传请求,即要上传的数据和上传地址。
/// uploadProgressBlock:上传进度回调,NSProgress对象用于获取上传进度信息。
/// completionHandler:上传完成后的回调,包含上传的响应、响应数据和错误信息。
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
{
/// 使用这个方法创建的上传任务,数据是通过流的方式上传的,而不是直接读取文件或数据进行上传,因此适用于上传大文件或者流数据
NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithStreamedRequest:request];
[self addDelegateForUploadTask:uploadTask progress:uploadProgressBlock completionHandler:completionHandler];
return uploadTask;
}
uploadTaskWithRequest
根据不同的数据创建一个NSURLSessionUploadTask
任务,最终都会走到AFURLSessionManageraddDelegateForUploadTask
为对应的uploadTask设置代理;
解析:
/// uploadTask:要添加代理的上传任务。
/// uploadProgressBlock:上传进度回调,通过该回调可以获取上传的进度信息。
/// completionHandler:上传完成回调,包含上传的响应、响应数据和错误信息。
- (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask
progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
{
/// 创建了一个AFURLSessionManagerTaskDelegate对象作为上传任务的代理,将该代理与上传任务关联
AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:uploadTask];
delegate.manager = self;
delegate.completionHandler = completionHandler;
/// 将上传任务的描述设置为AFURLSessionManager的taskDescriptionForSessionTasks属性。
uploadTask.taskDescription = self.taskDescriptionForSessionTasks;
/// 最后,将代理对象设置为上传任务的代理,并设置上传进度回调和上传完成回调
[self setDelegate:delegate forTask:uploadTask];
delegate.uploadProgressBlock = uploadProgressBlock;
}
downloadTaskWithRequest
/// 根据指定的请求创建downloadTask
// 参数:
/// request:下载请求,即要下载的资源地址。
/// downloadProgressBlock:下载进度回调,用于获取下载进度信息。
/// destination:下载目标回调,用于指定下载文件的存储位置。
/// completionHandler:下载完成回调,包含下载的响应、文件路径和错误信息。
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
{
/// 使用self.session创建一个NSURLSessionDownloadTask对象,即创建了一个下载任务。
NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithRequest:request];
/// 调用addDelegateForDownloadTask:progress:destination:completionHandler:方法为下载任务添加代理
[self addDelegateForDownloadTask:downloadTask progress:downloadProgressBlock destination:destination completionHandler:completionHandler];
return downloadTask;
}
downloadTaskWithResumeData
/// 创建重用数据的下载任务:根据已经下载的数据ResumeData创建下载任务继续进行下载
/// 官方:用于创建一个带有断点续传功能的下载任务并添加相关的代理。
// 参数
/// resumeData:包含了之前下载任务的断点续传数据,用于恢复之前的下载进度。
/// downloadProgressBlock:下载进度回调,用于获取下载进度信息。
/// destination:下载目标回调,用于指定下载文件的存储位置。
/// completionHandler:下载完成回调,包含下载的响应、文件路径和错误信息。
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
{
/// 首先使用self.session和提供的断点续传数据resumeData创建一个NSURLSessionDownloadTask对象,即创建了一个带有断点续传功能的下载任务。
NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithResumeData:resumeData];
/// 调用addDelegateForDownloadTask:progress:destination:completionHandler:方法为下载任务添加代理,并传入下载进度回调、目标回调和完成回调。
[self addDelegateForDownloadTask:downloadTask progress:downloadProgressBlock destination:destination completionHandler:completionHandler];
return downloadTask;
}
download最终也会调用addDelegateForDownloadTask
解析:
/// 该方法 用于为下载任务添加代理和相关的回
/// downloadTask:要添加代理的下载任务。
/// downloadProgressBlock:下载进度回调,用于获取下载进度信息。
/// destination:下载目标回调,用于指定下载文件的存储位置。
/// completionHandler:下载完成回调,包含下载的响应、文件路径和错误信息。、
- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask
progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
{
AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:downloadTask];
delegate.manager = self;
delegate.completionHandler = completionHandler;
/// 如果提供了destination回调,则设置代理的downloadTaskDidFinishDownloading属性为一个代码块,该代码块接收NSURLSession、NSURLSessionDownloadTask和下载文件的临时位置作为参数,并通过调用destination回调来返回最终的下载文件位置
if (destination) {
delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) {
return destination(location, task.response);
};
}
/// 设置下载任务的taskDescription属性为self.taskDescriptionForSessionTasks,这是用于描述任务的字符串。
downloadTask.taskDescription = self.taskDescriptionForSessionTasks;
[self setDelegate:delegate forTask:downloadTask];
delegate.downloadProgressBlock = downloadProgressBlock;
}
1.2.2 AFURLSessionMananger遵守的代理
在AFURLSessionMananger的实现文件里面可以发现NSURLSessionTaskDelegate
,NSURLSessionDataDelegate
以及NSURLSessionDownloadDelegate
。
需要提前说明的是AFURLSessionManager对这些代理做了一些公共的处理,最终转发到自定义的代理AFURLSessionManagerTaskDelegate的3个代理方法中,用来负责把每个task对应的数据回调回去;
围绕他们三个展开学习
NSURLSessionDownloadDelegate
NSURLSessionDownloadDelegate的方法在AFURLSessionMananger实现了3个。
URLSession:downloadTask:didFinishDownloadingToURL:
在下载任务完成后调用,提供下载文件的临时位置URL。可以在此方法中处理下载后的文件移动、保存等操作。URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
在下载任务进行中定期调用,提供下载进度的相关信息,包括已写入数据大小和总数据大小。可以在此方法中更新下载进度条等UI元素。URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:
在恢复下载任务时调用,提供已恢复的下载位置和预期的总字节数。
#pragma mark - NSURLSessionDownloadDelegate
/// 在下载任务完成后调用,提供下载文件的临时位置URL。可以在此方法中处理下载后的文件移动、保存等操作。
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
// 转发代理
AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask];
if (self.downloadTaskDidFinishDownloading) {
NSURL *fileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location);
if (fileURL) {
delegate.downloadFileURL = fileURL;
NSError *error = nil;
if (![[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error]) {
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidMoveFileSuccessfullyNotification object:downloadTask userInfo:nil];
}
return;
}
}
if (delegate) {
[delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location];
}
}
/// 在下载任务进行中定期调用,提供下载进度的相关信息,包括已写入数据大小和总数据大小。可以在此方法中更新下载进度条等UI元素。
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
// 转发代理
AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask];
if (delegate) {
[delegate URLSession:session downloadTask:downloadTask didWriteData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite];
}
if (self.downloadTaskDidWriteData) {
self.downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
}
}
/// 在恢复下载任务时调用,提供已恢复的下载位置和预期的总字节数
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes
{
// // 转发代理
AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask];
if (delegate) {
[delegate URLSession:session downloadTask:downloadTask didResumeAtOffset:fileOffset expectedTotalBytes:expectedTotalBytes];
}
if (self.downloadTaskDidResume) {
self.downloadTaskDidResume(session, downloadTask, fileOffset, expectedTotalBytes);
}
}
这三个代理方法最终都会进行代理转发,到AFURLSessionManagerTaskDelegate
中,AF中的deleagate是需要对应每个task去私有化处理的对应看看AFURLSessionManagerTaskDelegate
中的这三个代理方法都做了什么 吧:
ps:别跳转错了
#pragma mark - NSURLSessionDownloadDelegate
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
// 更新当前下载进度
self.downloadProgress.totalUnitCount = totalBytesExpectedToWrite;
self.downloadProgress.completedUnitCount = totalBytesWritten;
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes{
// 更新当前下载进度
self.downloadProgress.totalUnitCount = expectedTotalBytes;
self.downloadProgress.completedUnitCount = fileOffset;
}
/// ‼️下载完成调用
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
self.downloadFileURL = nil;
if (self.downloadTaskDidFinishDownloading) {
self.downloadFileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location);
if (self.downloadFileURL) {
NSError *fileManagerError = nil;
if (![[NSFileManager defaultManager] moveItemAtURL:location toURL:self.downloadFileURL error:&fileManagerError]) {
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:fileManagerError.userInfo];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidMoveFileSuccessfullyNotification object:downloadTask userInfo:nil];
}
}
}
}
- 在 ‼️ 下载完成时的调用代理方法中,
AFURLSessionManager
和AFURLSessionManagerTaskDelegate
中都进行了文件路径的移动,而NSURlSession
代理的下载路径是所有request公用的下载路径,设置之后所有的request都会下载到之前的那个路径。而AFURLSessionManagerTaskDelegate
中对应到每一个task中,每一个task可以设置自己的下载路径; - 总结:这些代理方法在
AFURLSessionManager
中实现的时候都是对session做一个公共的处理,每一个不同的task进行特定的处理时,需要将代理转发到AFURLSessionManagerTaskDelegate
中,在AFURLSessionManagerTaskDelegate
的代理中实现;
1.3 AFURLSessionManagerTaskDelegate的作用
AFURLSessionManagerTaskDelegate
是 AFNetworking 框架中的一个类,用于处理 URLSessionTask 相关的代理回调。它作为 AFURLSessionManager
的任务代理,负责处理网络请求任务的进度、完成回调等操作。
具体来说,AFURLSessionManagerTaskDelegate 的主要作用包括:
- 处理任务进度:通过设置 uploadProgressBlock 和 downloadProgressBlock 属性,可以监控上传任务和下载任务的进度,并在进度发生变化时执行相应的代码块。
- 处理任务完成回调:在任务完成时,会执行 completionHandler 属性所指定的代码块,将任务的响应、响应数据和错误信息传递给回调函数,以便进一步处理任务的结果。
- 处理下载任务的文件保存路径:对于下载任务,可以通过设置 downloadTaskDidFinishDownloading 属性,来指定任务完成后将文件保存的路径。
- 管理任务与代理的关系:在创建任务时,会将任务与对应的 AFURLSessionManagerTaskDelegate 对象关联起来,以确保任务的代理回调能够正确处理。
- 总的来说,AFURLSessionManagerTaskDelegate 扮演了一个中间角色,连接了 URLSessionTask 和 AFURLSessionManager 之间的交互,处理任务的进度、完成回调和其他相关操作,提供了更便捷的方式来管理和处理网络请求任务。
2. AFHTTPSessionManager
AFHTTPSessionManager本身是对网络请求做了一些简单的封装,请求的整个逻辑是分发给AFURLSessionManager或者其他类去做的;其内部管理自己的两种序列化工具,用来对请求和响应的数据做序列化;同时依赖于父类提供的保证安全,监控网络状态,实现发出HTTP请求的核心功能;
2.1 属性和接口
其实上一章已经很详细的说明了很多AFHTTPSessionManager的内容
AFHTTPSessionManager的一些方法的实现,初始化方法最终都会调用到AFURLSessionManager中的初始化方法完成sessionManager的初始化;
GET为例:
- (NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
progress:(nullable void (^)(NSProgress * _Nonnull))downloadProgress
success:(nullable void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{
/// 调用 dataTaskWithHTTPMethod:URLString:parameters:headers:uploadProgress:downloadProgress:success:failure: 方法,该方法创建一个 NSURLSessionDataTask 数据任务对象,用于执行指定的 HTTP GET 请求。将传入的参数传递给该方法以构建请求。
NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET"
URLString:URLString
parameters:parameters
headers:headers
uploadProgress:nil
downloadProgress:downloadProgress
success:success
failure:failure];
/// 调用 [dataTask resume] 方法启动数据任务,使其开始执行。
[dataTask resume];
/// 返回数据任务对象 dataTask。
return dataTask;
参数:
URLString:请求的URL值
parameters:根据需求的请求参数
headers:请求头
downloadProgress:更新下载进度的对象
success:任务成功后执行的Block对象
failure:任务失败后执行的Block对象
}
一是生成一个dataTask任务,二是调用resume开启请求;
该类的核心方法dataTaskWithHTTPMethod
:URLString:parameters:headers:uploadProgress:downloadProgress:success:failure: 该方法是生成datatask
,是AFHTTPSessionManager中的da taTaskWithHTTPMethod方法
在上一章也讲过! 很重要!
该方法做了两件事情:一是对请求参数进行序列化;二是调用dataTaskWithRequest方法生成后一个datatask任务;最终返回一个datatask;
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure
{
NSError *serializationError = nil;
/// 使用 `self.requestSerializer` 对象根据传入的参数构建一个 `NSMutableURLRequest` 可变请求对象。
/// self.requestSerializer:请求序列化器
/// ‼️‼️ 需要点进去的方法1
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
for (NSString *headerField in headers.keyEnumerator) {
[request setValue:headers[headerField] forHTTPHeaderField:headerField];
}
/// // 如果在构建请求过程中出现了 `serializationError` 错误,即请求参数序列化错误,则会执行相应的错误处理逻辑。
if (serializationError) {
if (failure) {
/// 如果存在 `failure` 失败回调,则将错误通过异步方式回调到主队列上。
dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
failure(nil, serializationError);
});
}
return nil;
}
/// 创建一个 `NSURLSessionDataTask` 数据任务对象
__block NSURLSessionDataTask *dataTask = nil;
/// 并调用 `dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:` 方法来配置任务的上传进度回调、下载进度回调和完成处理程序块。
// ‼️ 需要点进去的方法2
dataTask = [self dataTaskWithRequest:request
uploadProgress:uploadProgress
downloadProgress:downloadProgress
completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
if (failure) {
failure(dataTask, error);
}
} else {
if (success) {
success(dataTask, responseObject);
}
}
}];
return dataTask;
总结
到此,网络通讯模块所做的事情就到此,在该模块中主要的任务就是发起网络请求。分成AFURLSessionManger和 AFHTTPSessionManager两部分来做处理。 AFURLSessionManger是AFHTTPSessionManager的父类,其中AFURLSessionManger内部还包含AFURLSessionManagerTaskDelegate和_AFURLSessionTaskSwizzling;AFHTTPSessionManager本身是对网络请求做了一些简单的封装,请求的整个逻辑是分发给AFURLSessionManager或者其他类去做的;其内部管理自己的两种序列化工具,用来对请求和响应的数据做序列化;同时依赖于父类提供的保证安全,监控网络状态,实现发出HTTP请求的核心功能;
参考:AFN源码解析