AFNetworking 3.x 阅读笔记(二)

AFNetworking网络库结构

AFNetworking网络库的重要类如下图:

AFNetworking 3.x 阅读笔记(二)_第1张图片
网络库总体类结构.png

AFURLSessionManager是核心类,对外接口包装类使用的AFHTTPSessionManager.作者建议我们对AFHTTPSessionManager进行封装成我们自己使用的类.整个框架包括安全相关,网络状态监听,响应序列化,以及请求序列化. 其中通过数字标注大概的调用栈的走向.

AFHTTPSessonManager的GET/POST

下图是常用的GET/POST方法的封装.

AFNetworking 3.x 阅读笔记(二)_第2张图片
AFHTTPSessonManager对外接口方法.png

下图是使用AFHTTPSessionManager的dataTask相关的接口调用栈,与重要解释.

AFNetworking 3.x 阅读笔记(二)_第3张图片
dataTask接口调用栈.png

从图中可以看出,所有的接口方法都会调用到如下方法:

- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                       URLString:(NSString *)URLString
                                      parameters:(id)parameters
                                  uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
                                downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
                                         success:(void (^)(NSURLSessionDataTask *, id))success
                                         failure:(void (^)(NSURLSessionDataTask *, NSError *))failure
{
    NSError *serializationError = nil;
    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
    if (serializationError) {
        if (failure) {
            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
                failure(nil, serializationError);
            });
        }
        return nil;
    }
    __block NSURLSessionDataTask *dataTask = nil;
    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;
}

AFHTTPRequestSerializer实际是一个NSURLRequest的helper类,主要用于辅助NSURLRequest生成,包括四大块:

  • HTTP method以及相应的参数格式化,请求URL等
  • HTTP Headers: 包括UA, language等
  • HTTPBody(POST请求或者 mutilpart Post上传文件)
  • NSURLRequest的其他属性,例如timeout等

同时,使用AFQueryStringPair辅助格式化参数,其中比较重要的是递归将NSDictionary --> 特殊格式的NSString

AFHTTPSessonManager的 mutilpart POST

AFNetworking 3.x 阅读笔记(二)_第4张图片
版面 4.png

可以看出multipart Post和普通数据post多了使用AFStreamingMultipartFormData构造HTTP Body的过程.具体的解释可以参考前面的文章.

你可能感兴趣的:(AFNetworking 3.x 阅读笔记(二))