基于Swift的Web框架Vapor2.0文檔(翻譯)HTTP-Request

轉(zhuǎn)載請(qǐng)附原文鏈接:http://blog.fandong.me/2017/08/16/iOS-SwiftVaporWeb20/

前言

之前一直有做Java后臺(tái)開(kāi)發(fā)的興趣,可是想到要看好多的Java教程,作為一個(gè)iOS開(kāi)發(fā)者,我放棄了,
后來(lái)從朋友韓云智VL那里知道了這個(gè)框架,竟是用Swift寫(xiě)的,不得不說(shuō),它燃起了我的興趣。
Vapor是一個(gè)基于Swift開(kāi)發(fā)的服務(wù)端框架,可以工作于iOS,Mac OS,Ubuntu。
為了配合Swift部署到服務(wù)器,我把ECS的服務(wù)器系統(tǒng)改為Ubuntu16.04。

Vapor 2.0 - 文檔目錄
以下文字翻譯自Vapor Docs/HTTP/Request

請(qǐng)求

HTTP庫(kù)中最常用的交互部分就是Request類型,這里有一些這種類型中最常用的屬性.

public var method: Method
public var uri: URI
public var parameters: Node
public var headers: [HeaderKey: String]
public var body: Body
public var data: Content

方法

HTTP中與請(qǐng)求有關(guān)的請(qǐng)求,即:GET,POST,PUT,PATCH,DELETE.

URI

與請(qǐng)求關(guān)聯(lián)的URI,我們將使用它來(lái)訪問(wèn)請(qǐng)求發(fā)送的屬性
舉個(gè)例子,給定以下URI:http://vapor.codes/example?query=hi#fragments-too

let scheme = request.uri.scheme //http
let host = request.uri.host //Vapor.codes
let path = request.uri.path //example
let query = request.uri.query //query=hi
let fragment = request.uri.fragment // fragments-too

路由參數(shù)

與請(qǐng)求關(guān)聯(lián)的url參數(shù),舉個(gè)例子,如果我們有一個(gè)注冊(cè)的路徑hello/:name/age/:age,我們將能夠訪問(wèn)請(qǐng)求中的參數(shù).像這樣

let name = request.parameters["name"] //String
let age = request.parameters["age"]?.int //Int

或者,為了自動(dòng)拋出nil或無(wú)效的變量,你也可以extract

let name = try request.parameters.extract("name") as String
let age = try request.parameters.extract("age") as Int

這些提取方法可以轉(zhuǎn)換為任何NodeInitializable類型,包括您自己的自定義類型.確保查看節(jié)點(diǎn)了解更多信息

注意:Vapor還在我們的文檔部分提供了類型安全的路由

Headers(請(qǐng)求頭)

這些事與請(qǐng)求相關(guān)聯(lián)的請(qǐng)求頭,如果你正在準(zhǔn)備外發(fā)一個(gè)請(qǐng)求,可以使用它來(lái)添加自己的密鑰.

let contentType = request.headers["Content-Type"]  

或者對(duì)于外發(fā)請(qǐng)求

let request = Request ...
request.headers["Content-Type"] = "application/json"
request.headers["Authorization"] = ... my auth token

擴(kuò)展頭

我們通常會(huì)盡可能的刪除字符串類型的代碼來(lái)改進(jìn)代碼庫(kù),我們可以使用通用擴(kuò)展像請(qǐng)求頭中添加變量

extension HTTP.KeyAccessible where Key == HeaderKey, Value == String {
    var customKey: String? {
      get {
        return self["Custom-Key"]
      }
      set {
        self["Custom-Key"] = newValue
      }
    }
}

這種模式的實(shí)現(xiàn),我們的字符串Custom-Key已經(jīng)被包含在我們代碼的一個(gè)部分中,我們現(xiàn)在可以這樣訪問(wèn)

let customKey = request.headers.customKey

// or

let request = ...
request.headers.customKey = "my custom value"

請(qǐng)求體

這是與請(qǐng)求相關(guān)聯(lián)的主體,并且表示通用數(shù)據(jù)有效載荷,你可以在相關(guān)聯(lián)的文檔中查看有關(guān)正文的更多信息
對(duì)于傳入的請(qǐng)求,我們經(jīng)常這樣來(lái)拉出相關(guān)的字節(jié)

let rawBytes = request.body.bytes

Content(內(nèi)容)

通常,當(dāng)我們發(fā)送或者接收請(qǐng)求時(shí),我們正在用其作為傳輸內(nèi)容的方式吧,為此,Vapor提供了一個(gè)方便的data變量,這個(gè)變量關(guān)聯(lián)的請(qǐng)求要求以一致的方式對(duì)內(nèi)容進(jìn)行有限排序.
舉個(gè)例子,我收到一個(gè)請(qǐng)求http://vapor.codes?hello=world

let world = request.data["hello"]?.string

如果我收到一個(gè)JSON請(qǐng)求,這個(gè)相同的代碼也會(huì)起作用,例如

{
  "hello": "world"
}

仍然可以通過(guò)data訪問(wèn)

let world = request.data["hello"]?.string

注意:不應(yīng)該使用強(qiáng)制展開(kāi)
這也適用于多部分請(qǐng)求,甚至可以通過(guò)中間件擴(kuò)展到新的類型,如XML或者YAML
如果你想要更明確的的訪問(wèn)給定的類型,那是好的,data變量就是純粹為那些想這樣做的人提供方便的.

JSON

想要根據(jù)給定的請(qǐng)求直接訪問(wèn)JSON,請(qǐng)使用

let json = request.json["hello"]

查詢參數(shù)

同樣也是為了查詢方便

let query = request.query?["hello"]  // String?
let name = request.query?["name"]?.string // String?
let age = request.query?["age"]?.int // Int?
let rating = request.query?["rating"]?.double // Double?

關(guān)鍵路徑

關(guān)鍵路徑適用于可以進(jìn)行嵌套值對(duì)象的Vapor類型,這里有幾個(gè)例子,展示如歌訪問(wèn)給定的json

{
  "metadata": "some metadata",
  "artists" : {
    "href": "http://someurl.com",
    "items": [
      {
        "name": "Van Gogh",
      },
      {
        "name": "Mozart"
      }
    ]
  }
}

我們可以通過(guò)以下方式訪問(wèn)數(shù)據(jù)

元數(shù)據(jù)

訪問(wèn)頂級(jí)值

let type = request.data["metadata"].string // "some metadata"

項(xiàng)

訪問(wèn)嵌套值

let items = request.data["artists", "items"] // [["name": "Van Gogh"], ["name": "Mozart"]]

混合數(shù)組和對(duì)象

獲得第一批藝術(shù)家

let first = request.data["artists", "items", 0] // ["name": "Van Gogh"]

數(shù)組各項(xiàng)
從數(shù)組項(xiàng)中獲取密鑰

let firstName = request.data["artists", "items", 0, "name"] // "Van Gogh"

數(shù)組解析
我們也可以巧妙的映射一系列鍵,例如,只需獲得所有藝術(shù)家的名字,我們可以使用

let names = request.data["artists", "items", "name"] // ["Van Gogh", "Mozart"]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容