轉(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。
請(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"]