Alamofire 源码学习(二)- 源文件与接口

本文所使用的 Almofire 库的版本是 3.4.1。

源文件

Alamofire 的源文件不多,按照功能职责分为 Core 和 Features 两组,再加上一个提供公有接口的 Alamofire.swift 文件:

Source/
├── Alamofire.swift                    // 定义了 Alamofire 的公有接口
|
├── Core/
|   ├── Error.swift                    // 定义了一组错误码
|   ├── Manager.swift                    // 负责创建请求
|   ├── Notifications.swift            // 定义了一组通知名称,Alamofire 会在特定时刻发布这些通知
|   ├── ParameterEncoding.swift        // 定义了一组参数编码方案
|   ├── Request.swift                    // 可以认为是对 NSURLRequest 的封装
|   ├── Response.swift                  // 可以认为是对 NSURLResponse 的封装
|   └── Result.swift                      // 返回值的抽象
|
└── Features/
    ├── Download.swift                  // 处理下载任务
    ├── MultipartFormData.swift           // multipart/form-data 的抽象
    ├── NetworkReachabilityManager.swift  // 网络联通性指示器
    ├── ResponseSerialization.swift       // 对返回值进行序列化
    ├── ServerTrustPolicy.swift           // 定义了一组主机信任策略
    ├── Stream.swift                      // 处理流式任务
    ├── Timeline.swift                    // 对请求的生命周期进行计时
    ├── Upload.swift                      // 处理上传任务
    └── Validation.swift                  // 对返回值进行验证

下面的(并不十分准确的)示意图可以帮助理解 Alamofire 的内部机制:

Internal Process

接口

新开始阅读一个库的源代码时,往往不容易找到合理的入口点。考察这个库的公有接口可能是一个很好的起点。首先,我们可以借此建立对该库的直观认识(可能比较浅显,不过现阶段足够了);然后,循着这些接口我们可以由浅入深,抽丝剥茧,逐渐全盘理解该库的运作方式。总结来说,Alamofire 所提供的公有接口分为这几大类:建立请求,处理返回,认证身份,设置请求头部和设置请求参数。

创建请求

根据不同的目的,请求可以分为三种:普通请求,下载请求,上传请求。

创建一个普通请求:

Alamofire.request(.GET, “https://httpbin.org/get”)

创建一个下载请求:

Alamofire.download(.GET, “https://httpbin.org/stream/100”)

创建一个上传请求:

let fileURL = NSBundle.mainBundle().URLForResource(“Default”, withExtension: “png”)
Alamofire.upload(.POST, “https://httpbin.org/post”, file: fileURL)

请求的第一个参数是一个枚举类型,其定义如下:

public enum Method: String {
    case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT
}

处理返回

Alamofire 的链式调用机制帮助我们写出简洁的代码。例如,我们可以将创建请求和处理请求返回的代码写在一条语句里面:

Alamofire.request(.GET, "https://httpbin.org/get")
         .response { request, response, data, error in
             print(request)
             print(response)
             print(data)
             print(error)
          }

如果你希望 Alamofire 对返回值进行序列化处理,可以使用下面这些变体方法。

返回 NSData 类型的数据:

Alamofire.request(.GET, "https://httpbin.org/get")
         .responseData { response in
             print(response.request)
             print(response.response)
             print(response.result)
          }

返回 String 类型的数据:

Alamofire.request(.GET, "https://httpbin.org/get")
         .validate()
         .responseString { response in
             print("Success: \(response.result.isSuccess)")
             print("Response String: \(response.result.value)")
         }

返回 JSON 类型的数据:

Alamofire.request(.GET, "https://httpbin.org/get")
         .responseJSON { response in
             debugPrint(response)
         }

认证身份

使用 HTTP 基本认证

let user = "user"
let password = "password"

Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")
         .authenticate(user: user, password: password)
         .responseJSON { response in
             debugPrint(response)
         }

使用 NSURLCredential

let user = "user"
let password = "password"

let credential = NSURLCredential(user: user, password: password, persistence: .ForSession)

Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")
         .authenticate(usingCredential: credential)
         .responseJSON { response in
             debugPrint(response)
         }

设置�请求头部

let headers = [
    "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
    "Accept": "application/json"
]

Alamofire.request(.GET, "https://httpbin.org/get", headers: headers)
         .responseJSON { response in
             debugPrint(response)
         }

设置请求参数

带有 URL-Encoded 参数的 GET 请求:

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
// https://httpbin.org/get?foo=bar

带有 URL-Encoded 参数的 POST 请求:

let parameters = [
    "foo": "bar",
    "baz": ["a", 1],
    "qux": [
        "x": 1,
        "y": 2,
        "z": 3
    ]
]

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters)
// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3

带有 JSON 参数的 POST 请求:

let parameters = [
    "foo": [1,2,3],
    "bar": [
        "baz": "qux"
    ]
]

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters, encoding: .JSON)
// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}

(未完)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,852评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Alamofire 是一款 Swift 写的 HTTP 网络请求库 前言 本篇内容为 Alamofire 官方 R...
    zongmumask阅读 20,660评论 6 66
  • 尽管Alamofire的github文档已经做了很详细的说明,我还是想重新梳理一遍它的各种用法,以及这些方法的一些...
    老马的春天阅读 15,921评论 28 134
  • 我竟然把自己的生日给忘了。 平日觉得比过春节还要重要的日子,在日复一日重复的学习和生活中被淡忘,就好像有时候,从书...
    BO博赞礼阅读 212评论 1 1