AFNetworking可以說是iOS中最常用的開源框架了,在GitHub中的地址https://github.com/AFNetworking/AFNetworking主要是對NSURLSession進行對封裝操作,其中主要分為了七個類,最常用的就是AFHTTPSessionManager,它繼承自于AFURLSessionManager;
在日常工作中,我們經常用去使用HTTP請求來獲取、處理數據,常用的請求方式就是Get和Post請求,這個面試的時候也會經常被問到他們至今的區別,我查看的資料基本上都講述以下內容:
從表面上看:
Get以?分割拼接在URL后面,有長度限制,是明文顯示;Post請求參數放在Body里面,一般沒有長度顯示,不是明文顯示,略微安全
從語義(協議的定義規范)上看:
Get是獲取資源的,是安全的(不引起server端的變化)、冪等的(同一請求方法執行一次和執行多次效果相同),可緩存的
Post是處理資源,是不安全的,非冪等的,不可緩存的
講回正題,寫一下調用Get方法的流程
首先,我們要發起請求,主要調用該Get方法
- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(nullable id)parameters
headers:(nullable NSDictionary <NSString *, NSString *> *)headers
progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
在這個方法中,主要是創建了一個NSURLSessionDataTask任務,來對服務器端端數據進行讀取操作
NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET"
URLString:URLString
parameters:parameters
headers:headers
uploadProgress:nil
downloadProgress:downloadProgress
success:success
failure:failure];
[dataTask resume];
return dataTask;
隨后就會使用到dataTaskWithHTTPMethod這個方法,在這個方法中,框架會使用到NSMutableURLRequest來設置request屬性參數、設置HTTP的頭部請求字段headerField、對序列化進行一次判斷,失敗則進行異步操作直接返回nil,上述操作無問題則創建NSURLSessionDataTask,傳遞給URLSessionManager做任務請求;在這個方法中,又主要調用了requestWithMethod:、dataTaskWithRequest:這兩個方法
NSError *serializationError = nil;
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];
}
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;
基本上Get請求的調用就是這樣,在這其中,最終的方法就是dataTaskWithHTTPMethod這個方法做了最后的結果返回,在這一系列方法中,我們用到了NSMutableURLRequest進行了URLRequest的請求創建,并設置 request 的 allowsCellularAccess、cachePolicy、HTTPShouldHandleCookies、HTTPShouldUsePipelining、networkServiceType、timeoutInterval等屬性
了解的不深,先寫這么多,等再學習NSURLSession之后再對AFNetworking進行深入描述;