Alamofire之request

在上一篇【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 方法。 網絡

URLRequest處理

  • 使用 urlmethodheaders 初始化 URLRequest
  • encode。

那麼 encode 中是如何處理請求地址以及參數的呢?源碼分析

GET

若是是 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

若是是 POST 請求,則設置頭部的 Content-Type,將參數處理後放入 httpBody 便可。3d

至於其餘的請求方式,請小夥伴自行查看源碼,這裏只分析常見的 GETPOST請求。

request

urlRequest 處理好以後,就能夠發起網絡請求了。

小夥伴們須要注意了,這裏的 DataRequest.Requestable 並非調用的 DataRequest 類方法或者靜態方法。經過查看源碼也能夠知道,並無這樣一個方法。那這裏調用的究竟是什麼呢?

這裏調用的實際上是一個類中結構體的默認構造方法。

再調用 Requestable.task 在隊列中同步生成網絡請求 task

使用生成的 task 初始化 DataRequest。由於 DataRequest 繼承自 Request,因此,調用的是父類 Requesttask 方法生成 request

而後將 taskrequest 存入 delegate,創建一一對應的關係。

最後再調用 request.resume() 啓動任務。

以上就是網絡請求 request 的源碼分析。感受寫得有點亂,之後有機會再完善吧。不足之處,請評論指正。

相關文章
相關標籤/搜索