本文所使用的 Almofire 庫的版本是 3.4.1。
源文件
Alamofire 的源文件不多,按照功能職責分為 Core 和 Features 兩組,再加上一個提供公有接口的 Alamofire.swift 文件:
Source/
├── Alamofire.swift // 定義了 Alamofire 的公有接口
|
├── Core/
| ├── Error.swift // 定義了一組錯誤碼
| ├── Manager.swift // 負責創(chuàng)建請求
| ├── Notifications.swift // 定義了一組通知名稱,Alamofire 會在特定時刻發(fā)布這些通知
| ├── ParameterEncoding.swift // 定義了一組參數(shù)編碼方案
| ├── Request.swift // 可以認為是對 NSURLRequest 的封裝
| ├── Response.swift // 可以認為是對 NSURLResponse 的封裝
| └── Result.swift // 返回值的抽象
|
└── Features/
├── Download.swift // 處理下載任務
├── MultipartFormData.swift // multipart/form-data 的抽象
├── NetworkReachabilityManager.swift // 網(wǎng)絡聯(lián)通性指示器
├── ResponseSerialization.swift // 對返回值進行序列化
├── ServerTrustPolicy.swift // 定義了一組主機信任策略
├── Stream.swift // 處理流式任務
├── Timeline.swift // 對請求的生命周期進行計時
├── Upload.swift // 處理上傳任務
└── Validation.swift // 對返回值進行驗證
下面的(并不十分準確的)示意圖可以幫助理解 Alamofire 的內部機制:

接口
新開始閱讀一個庫的源代碼時,往往不容易找到合理的入口點??疾爝@個庫的公有接口可能是一個很好的起點。首先,我們可以借此建立對該庫的直觀認識(可能比較淺顯,不過現(xiàn)階段足夠了);然后,循著這些接口我們可以由淺入深,抽絲剝繭,逐漸全盤理解該庫的運作方式??偨Y來說,Alamofire 所提供的公有接口分為這幾大類:建立請求,處理返回,認證身份,設置請求頭部和設置請求參數(shù)。
創(chuàng)建請求
根據(jù)不同的目的,請求可以分為三種:普通請求,下載請求,上傳請求。
創(chuàng)建一個普通請求:
Alamofire.request(.GET, “https://httpbin.org/get”)
創(chuàng)建一個下載請求:
Alamofire.download(.GET, “https://httpbin.org/stream/100”)
創(chuàng)建一個上傳請求:
let fileURL = NSBundle.mainBundle().URLForResource(“Default”, withExtension: “png”)
Alamofire.upload(.POST, “https://httpbin.org/post”, file: fileURL)
請求的第一個參數(shù)是一個枚舉類型,其定義如下:
public enum Method: String {
case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT
}
處理返回
Alamofire 的鏈式調用機制幫助我們寫出簡潔的代碼。例如,我們可以將創(chuàng)建請求和處理請求返回的代碼寫在一條語句里面:
Alamofire.request(.GET, "https://httpbin.org/get")
.response { request, response, data, error in
print(request)
print(response)
print(data)
print(error)
}
如果你希望 Alamofire 對返回值進行序列化處理,可以使用下面這些變體方法。
返回 NSData 類型的數(shù)據(jù):
Alamofire.request(.GET, "https://httpbin.org/get")
.responseData { response in
print(response.request)
print(response.response)
print(response.result)
}
返回 String 類型的數(shù)據(jù):
Alamofire.request(.GET, "https://httpbin.org/get")
.validate()
.responseString { response in
print("Success: \(response.result.isSuccess)")
print("Response String: \(response.result.value)")
}
返回 JSON 類型的數(shù)據(jù):
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)
}
設置請求參數(shù)
帶有 URL-Encoded 參數(shù)的 GET 請求:
Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
// https://httpbin.org/get?foo=bar
帶有 URL-Encoded 參數(shù)的 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 參數(shù)的 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"}}
(未完)