Vapor文档学习廿八: HTTP -Response

2017-04-24  本文已影响43人  Supremodeamor

在接收的请求后通常要返回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部分。

上一篇下一篇

猜你喜欢

热点阅读