在上一篇【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 的源码分析。感受写得有点乱,之后有机会再完善吧。不足之处,请评论指正。