此次主要開始講解一下文件夾Serialization下的類AFURLRequestSerialization。
數組
AFURLRequestSerialization類遵照`AFURLRequestSerialization`和`AFURLResponseSerialization`協議,提供一個查詢字符串/表單編碼的參數序列化和默認請求頭的具體的基本的實現,以及響應狀態代碼和內容類型驗證。也就是對發出的請求進行一些處理。緩存
處理HTTP的任何請求或響應序列化被鼓勵納入「AFHTTPRequestSerializer」的子類,以確保一致的缺省行爲。cookie
下面仍是先看一下.h文件,看一下相關屬性網絡
第一個表示編碼類型,字符串編碼用於序列化的參數,默認值是UTF8編碼
第二個bool類型表示是否建立請求可使用設備的移動無線(若是阻止的話)。默認是YES,set方法是setAllowsCellularAccessurl
第三個表示緩存策略,建立請求的緩存策略,默認是NSURLRequestUseProtocolCachePolicyspa
第一個是否建立的請求應該使用默認的cookie處理,默認是YES操作系統
第二個是否建立的請求在接收一個來自一個更近的傳輸源的響應以前能夠繼續傳輸數據,默認是不能夠NO3d
第三個爲建立的請求的網絡服務類型,默認是NSURLNetworkServiceTypeDefault代理
第四個爲超時時間間隔,以秒爲建立請求。默認超時時間間隔是60秒。
缺省HTTP報頭字段值用於序列化的請求。默認狀況下,這些包括如下:——「接收語言」帶有NSLocale」+ preferredLanguages '的內容——「用戶代理」帶有各類包標識符和操做系統的名稱的內容
下面看一下實現文件
AFPercentEscapedStringFromString
方法將string裏面的:#[]@!$&’()*+,;=字符替換成%
從可用字符替換刪除掉:#[]@!$&’()*+,;=這些字符,聲明批量處理的大小爲50,循環將string裏面的這些字符替換成%
往下看能夠發現
在AFQueryStringPair
類裏面有個- URLEncodedStringValue
方法,
在這個方法裏,將請求裏面的URL參數轉成field=value形式。
參數字典裏面是咱們查詢的key和value,咱們經過將字典內容轉成AFQueryStringPair
對象,調用- URLEncodedStringValue
方法,轉成key=value,放到mutablePairs數組裏,最後用&符拼接起來。
若是是字典,遍歷後返回key[nestedKey]=nestedValue;
若是是數組,遍歷後返回key[nestedKey]=nestedValue;
若是是集合,遍歷後返回key=obj;
若是是其餘的,返回key=value.
根據上述分析
假設傳入key和value,我將key,value放到數組裏面,再放到mutableQueryStringComponents裏
NSSet *afSet = [NSSet setWithObjects:@(1),@(2), nil];
NSDictionary *afDic = @{@"dickey": @{@"nestKey": @"nestValue"},
@"arrayKey": @[@[@(1)]],
@"setKey": afSet,
@"generalKey": @"generalValue"};
NSArray *resultArray = AFQueryStringPairsFromKeyAndValue(nil, afDic);
打印獲得的結果是
[[arrayKey, 1],
[dickey[nestKey],nestValue],
[generalKey, generalValue],
[setKey, 1],
[setKey,2]]
接下來主要看一下AFHTTPRequestSerializer初始化方法,咱們使用AFHTTPRequestSerializer
對HTTP請求的頭部進行處理
首先調用+ serializer
進行初始化,裏面調用了本身init方法
init裏面先將Accept-Language存到mutableHTTPRequestHeaders裏
將mainBundle裏面根據使用語言的優先順序放到acceptLanguagesComponents裏面,再用","分隔,存到mutableHTTPRequestHeaders字典裏面
而後拼接User-Agent,格式爲」%@/%@ (%@; iOS %@; Scale/%0.2f)」,裏面須要5個參數,第一個參數先獲取項目名,若是沒有,就用BundleIdentifier,第二個參數先獲取短版本號,若是沒有就用版本號,第三個參數是當前設備的類型,第四個參數是當前設備的版本號,第五個參數是屏幕的比例
而後設置屬性的監聽,這些屬性在頭文件裏面均可以找到,實現文件裏面也實現了set方法。在這裏邊調用了靜態方法AFHTTPRequestSerializerObservedKeyPaths
下面實現了模式鍵值觀察
經過KVO判斷是不是新值,若是是的話,就加到mutableObservedChangedKeyPaths裏面。
設置驗證字段。
在初始化以後須要調用一下方法
根據url初始化,設置HTTP方法,根據mutableObservedChangedKeyPaths存儲的屬性,設置到mutableRequest當中,
調用- [requestBySerializingRequest:withParameters:error]方法,該方法以下
根據HTTPRequestHeaders來設置mutableRequest的頭部字段。若是設置了queryStringSerialization這個block的話,就須要設置一個自定義的查詢語句序列化方法,轉成query查詢參數。若是沒有設置,則調用AFQueryStringFromParameters方法,轉成query查詢參數。將拼接好的query語句放到 mutableRequest.URL或者放到mutableRequest的HTTPBody裏。
若有轉載,請註明出處
參考文章:http://zeeyang.com/2016/05/25/AFNetWorking-five/