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

相关文章
相关标签/搜索