Vapor文件學習廿八: HTTP -Response

weixin_34006468發表於2017-04-24

在接收的請求後通常要返回Response作為響應。我們做外部請求時也要接收響應物件。

public let status: Status
public var headers: [HeaderKey: String]
public var body: Body
public var data: Content

Status

http請求狀態,比如.ok == 200表示請求成功。

Headers

與請求相關的請求頭資訊。如果準備對外部請求做出響應,你可以新增自己的keys。

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

或者

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

Extending Headers

使用擴充套件優化程式碼:

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

"Custom-Key"已經包含在程式碼中,可以直接獲取:

let customKey = response.headers.customKey

// or

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

Body

承載Response的主體內容。主要通過兩種方式在初始化時進行設定。

BodyRepresentable

可以轉換為位元組的例項:

let response = Response(status: .ok, body: "some string")

上面的String會自動轉換為body。你自己的型別也可以這樣使用。

BytesDirectory

直接使用Bytes array:

let response = Response(status: .ok, body: .data(myArrayOfBytes))

Chunked

傳送一個HTTP.Response的程式碼塊,我們可以通過傳遞閉包傳送body部分。

let response = Response(status: .ok) { chunker in
  for name in ["joe", "pam", "cheryl"] {
      sleep(1)
      try chunker.send(name)
  }

  try chunker.close()
}

Note:在chunk銷燬之前一定要呼叫close()方法。

Content

從響應中獲取content和從Request中獲取一樣:

let pokemonResponse = try drop.client.get("http://pokeapi.co/api/v2/pokemon/")
let names = pokemonResponse.data["results", "name"]?.array

JSON

直接使用json資料”

let json = response.json["hello"]

Key Paths

使用方法同Request中的Key Paths部分。

相關文章