轉(zhuǎn)載請附原文鏈接:http://blog.fandong.me/2017/08/17/iOS-SwiftVaporWeb21/
前言
之前一直有做Java后臺開發(fā)的興趣团秽,可是想到要看好多的Java教程,作為一個iOS開發(fā)者钦铁,我放棄了,
后來從朋友韓云智VL那里知道了這個框架乾巧,竟是用Swift寫的派近,不得不說,它燃起了我的興趣忘嫉。
Vapor是一個基于Swift開發(fā)的服務端框架,可以工作于iOS案腺,Mac OS庆冕,Ubuntu。
為了配合Swift部署到服務器,我把ECS的服務器系統(tǒng)改為Ubuntu16.04救湖。
響應
當我們構建結束點時,我們通常會返回請求的響應,如果我們正在發(fā)出請求,我們將受到.
public let status: Status
public var headers: [HeaderKey: String]
public var body: Body
public var data: Content
狀態(tài)
與事件關聯(lián)的http狀態(tài),例如.ok
==200 ok
請求頭
這些是與請求相關的頭,如果你正在準備一個傳出的響應,這可以用來添加你的密鑰.
let contentType = response.headers["Content-Type"]
或者外發(fā)響應
let response = response ...
response.headers["Content-Type"] = "application/json"
response.headers["Authorization"] = ... my auth token
擴展頭
我們通常會盡可能的刪除字符串類型的代碼來改進代碼庫,我們可以使用通用的擴展向請求頭中添加變量.
extension HTTP.KeyAccessible where Key == HeaderKey, Value == String {
var customKey: String? {
get {
return self["Custom-Key"]
}
set {
self["Custom-Key"] = newValue
}
}
}
實現(xiàn)這種模式后,我們的字符串Custom-Key
包含在我們代碼的一個部分中,我們現(xiàn)在可以這樣訪問:
let customKey = response.headers.customKey
// or
let request = ...
response.headers.customKey = "my custom value"
請求體
這是與響應相關聯(lián)的請求體,并表示通用數(shù)據(jù)有效載荷,您可以在相關聯(lián)的文檔中查看有關請求體的更多信息
對于響應,請求體最初設置為初始化,有兩種主要類型.
BODYREPRESENTABLE
可以轉(zhuǎn)換成二進制的對象,比如
let response = Response(status: .ok, body: "some string")
在上面的例子中,字符串將自動轉(zhuǎn)換為正文,你自己的類型也可以做到這樣.
BYTES DIRECTLY
如果我們已經(jīng)有了我們自己的字節(jié)數(shù)組,我們可以像這樣傳遞給它
let response = Response(status: .ok, body: .data(myArrayOfBytes))
CHUNKED(分塊)
要發(fā)送一個HTTP.Response
塊,我們可以傳遞一個閉包,我們將用來發(fā)送我們的響應部分.
let response = Response(status: .ok) { chunker in
for name in ["joe", "pam", "cheryl"] {
sleep(1)
try chunker.send(name)
}
try chunker.close()
}
確保
close()
在chunker離開范圍之前調(diào)用.
內(nèi)容
我們可以訪問內(nèi)容和我們在請求中一樣,這最常用于外發(fā)請求
let pokemonResponse = try drop.client.get("http://pokeapi.co/api/v2/pokemon/")
let names = pokemonResponse.data["results", "name"]?.array
JSON
要在給定的響應中訪問JSON,使用下面的代碼
let json = request.response["hello"]
關鍵路徑
獲取更多信息,訪問這里
服務端文件
如果你只想從公共目錄來查看服務端文件,你查看FileMiddleware
應該是有用的.
let res = try Response(filePath: "/path/to/file.txt")
使用它來初始化文件路徑的文件響應,例如,如果使用公共文件夾,文件名應該在前面添加公共目錄的路徑,即drop.publicDir + "myFile.cool"
Response(filePath: String, ifNoneMatch: String? = nil, chunkSize: Int = 2048) throws
如果沒有匹配表示將用于檢查客戶端上次加載后文件是否已更改的ETag,這樣像瀏覽器這樣的客戶端,可以緩存他們的文件,避免不必要的重復下載,最常計算的是/ https://tools.ietf.org/html/rfc7232#section-3.2
有關怎么使用的示例,請查看"FileMiddleware"