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部分。