Alamofire 源碼學習(二)- 源文件與接口

本文所使用的 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 的內部機制:

Internal Process

接口

新開始閱讀一個庫的源代碼時,往往不容易找到合理的入口點??疾爝@個庫的公有接口可能是一個很好的起點。首先,我們可以借此建立對該庫的直觀認識(可能比較淺顯,不過現(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"}}

(未完)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,394評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • Alamofire 是一款 Swift 寫的 HTTP 網(wǎng)絡請求庫 前言 本篇內容為 Alamofire 官方 R...
    zongmumask閱讀 21,236評論 6 66
  • 盡管Alamofire的github文檔已經(jīng)做了很詳細的說明,我還是想重新梳理一遍它的各種用法,以及這些方法的一些...
    老馬的春天閱讀 16,422評論 28 135
  • 我竟然把自己的生日給忘了。 平日覺得比過春節(jié)還要重要的日子,在日復一日重復的學習和生活中被淡忘,就好像有時候,從書...
    BO博贊禮閱讀 249評論 1 1

友情鏈接更多精彩內容