AFNetworking網(wǎng)絡(luò)庫(kù)結(jié)構(gòu)
AFNetworking網(wǎng)絡(luò)庫(kù)的重要類(lèi)如下圖:
網(wǎng)絡(luò)庫(kù)總體類(lèi)結(jié)構(gòu).png
AFURLSessionManager
是核心類(lèi),對(duì)外接口包裝類(lèi)使用的AFHTTPSessionManager
.作者建議我們對(duì)AFHTTPSessionManager
進(jìn)行封裝成我們自己使用的類(lèi).整個(gè)框架包括安全相關(guān),網(wǎng)絡(luò)狀態(tài)監(jiān)聽(tīng),響應(yīng)序列化,以及請(qǐng)求序列化. 其中通過(guò)數(shù)字標(biāo)注大概的調(diào)用棧的走向.
AFHTTPSessonManager的GET/POST
下圖是常用的GET/POST方法的封裝.
AFHTTPSessonManager對(duì)外接口方法.png
下圖是使用AFHTTPSessionManager
的dataTask相關(guān)的接口調(diào)用棧,與重要解釋.
dataTask接口調(diào)用棧.png
從圖中可以看出,所有的接口方法都會(huì)調(diào)用到如下方法:
- (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
實(shí)際是一個(gè)NSURLRequest
的helper類(lèi),主要用于輔助NSURLRequest
生成,包括四大塊:
- HTTP method以及相應(yīng)的參數(shù)格式化,請(qǐng)求URL等
- HTTP Headers: 包括UA, language等
- HTTPBody(POST請(qǐng)求或者 mutilpart Post上傳文件)
- NSURLRequest的其他屬性,例如timeout等
同時(shí),使用
AFQueryStringPair
輔助格式化參數(shù),其中比較重要的是遞歸將NSDictionary --> 特殊格式的NSString
AFHTTPSessonManager的 mutilpart POST
版面 4.png
可以看出multipart Post和普通數(shù)據(jù)post多了使用AFStreamingMultipartFormData
構(gòu)造HTTP Body的過(guò)程.具體的解釋可以參考前面的文章.