Alamofire之request

338 阅读2分钟

在上一篇【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处理

  • 使用 urlmethodheaders 初始化 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 即可。

至于其他的请求方式,请小伙伴自行查看源码,这里只分析常见的 GETPOST请求。

request

urlRequest 处理好之后,就可以发起网络请求了。

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

这里调用的其实是一个类中结构体的默认构造方法。

再调用 Requestable.task 在队列中同步生成网络请求 task

使用生成的 task 初始化 DataRequest。因为 DataRequest 继承自 Request,所以,调用的是父类 Requesttask 方法生成 request

然后将 taskrequest 存入 delegate,建立一一对应的关系。

最后再调用 request.resume() 启动任务。

以上就是网络请求 request 的源码分析。感觉写得有点乱,以后有机会再完善吧。不足之处,请评论指正。