在上一篇【Alamofire之SessionManager】中,已經分析過SessionManager源碼,在本篇中,我將和小夥伴一塊兒來分析一下 request 的源碼。swift
先舉個栗子:數組
let urlBD = "https://www.baidu.com"
Alamofire.request(urlBD, method: .get, parameters: ["user": "bo", "pwd": "123456"]).response { (response) in
print(response)
}
複製代碼
咱們在作網絡請求時,調用的是 request
方法。其內部調用的是 SessionManager.request
方法。 網絡
url
、method
、headers
初始化 URLRequest
。那麼 encode 中是如何處理請求地址以及參數的呢?源碼分析
若是是 GET 請求,則會對url進行百分號編碼。post
若是無參數,則直接返回urlRequest。ui
若是有參數,還會對參數進行 query
處理。編碼
query
會遍歷傳入的字典,獲取key-value鍵值對。再將key-value鍵值對傳給 queryComponents
處理,而後返回一個元組數組。 url
queryComponents
會遞歸處理傳入的鍵值對,即若是傳入的key-value中還有字典或數組,則會一直遞歸調用,直到基本數據類型,纔將其封裝爲元組數組返回出去。
最後 query
方法接收到queryComponents
返回的全部元組數組,併合併爲一個數組。 再調用 components.map { "\($0)=\($1)" }.joined(separator: "&")
將數組處理成如 user=bo&pwd=123456
這樣的格式。spa
若是是 POST 請求,則設置頭部的 Content-Type
,將參數處理後放入 httpBody
便可。3d
至於其餘的請求方式,請小夥伴自行查看源碼,這裏只分析常見的 GET、POST請求。
urlRequest 處理好以後,就能夠發起網絡請求了。
小夥伴們須要注意了,這裏的 DataRequest.Requestable
並非調用的 DataRequest
類方法或者靜態方法。經過查看源碼也能夠知道,並無這樣一個方法。那這裏調用的究竟是什麼呢?
這裏調用的實際上是一個類中結構體的默認構造方法。
再調用 Requestable.task
在隊列中同步生成網絡請求 task。
使用生成的 task
初始化 DataRequest
。由於 DataRequest
繼承自 Request
,因此,調用的是父類 Request
的 task
方法生成 request
。
而後將 task
和 request
存入 delegate
,創建一一對應的關係。
最後再調用 request.resume()
啓動任務。
以上就是網絡請求 request 的源碼分析。感受寫得有點亂,之後有機會再完善吧。不足之處,請評論指正。