在上一篇【Alamofire之SessionManager】中,已经分析过SessionManager源码,在本篇中,我将和小伙伴一起来分析一下 request 的源码。
先举个栗子:
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处理
- 使用
url
、method
、headers
初始化URLRequest
。 - encode。
那么 encode 中是如何处理请求地址以及参数的呢?

GET
如果是 GET 请求,则会对url进行百分号编码。
如果无参数,则直接返回urlRequest。
如果有参数,还会对参数进行 query
处理。

query
会遍历传入的字典,获取key-value键值对。再将key-value键值对传给 queryComponents
处理,然后返回一个元组数组。

queryComponents
会递归处理传入的键值对,即如果传入的key-value中还有字典或数组,则会一直递归调用,直到基本数据类型,才将其封装为元组数组返回出去。
最后 query
方法接收到queryComponents
返回的所有元组数组,并合并为一个数组。
再调用 components.map { "\($0)=\($1)" }.joined(separator: "&")
将数组处理成如 user=bo&pwd=123456
这样的格式。
POST
如果是 POST 请求,则设置头部的 Content-Type
,将参数处理后放入 httpBody
即可。
至于其他的请求方式,请小伙伴自行查看源码,这里只分析常见的 GET、POST请求。
request
urlRequest 处理好之后,就可以发起网络请求了。

小伙伴们需要注意了,这里的 DataRequest.Requestable
并不是调用的 DataRequest
类方法或者静态方法。通过查看源码也可以知道,并没有这样一个方法。那这里调用的到底是什么呢?
这里调用的其实是一个类中结构体的默认构造方法。

再调用 Requestable.task
在队列中同步生成网络请求 task。
使用生成的 task
初始化 DataRequest
。因为 DataRequest
继承自 Request
,所以,调用的是父类 Request
的 task
方法生成 request
。

然后将 task
和 request
存入 delegate
,建立一一对应的关系。
最后再调用 request.resume()
启动任务。
以上就是网络请求 request 的源码分析。感觉写得有点乱,以后有机会再完善吧。不足之处,请评论指正。
网友评论