传统的HTTP服务器就是得到Request
然后返回Response
。Vapor也是没什么不同,但是我们利用Swift强大的协议功能使用户面对API时更加灵活。
让我们从ResponseRepresentable
的定义开始学习:
public protocol ResponseRepresentable {
func makeResponse() throws -> Response
}
通过遵守此协议,我们可以更加灵活的返回一些符合要求的内容,而不必每次都手动创建Response
。Vapor提供了一些默认的类型,但是并不限于这些。
String
由于String
遵守了ResponseRepresentable
协议,所以我们可以直接在Vapor路由处理中返回它。
drop.get("hello") { request in
return "Hello, World!"
}
JSON
可以直接返回JSON
而不必每次都手动创建响应。
drop.get("hello") { request in
return try JSON(node: [
"hello": "world",
"some-numbers": [
1,
2,
3
]
]
)
}
Response
当然我们可以使用Response返回任何没有包括的内容。
drop.get("hello") { request in
return Response(status: .ok, headers: ["Content-Type": "text/plain"], body: "Hello, World!")
}
Comforming
如果要返回我们自定义的类型,只需要遵守ResponseRepresentable
协议。下面我们来看一个简单的博客模型类案例。
import Foundation
struct BlogPost {
let id: String
let content: String
let createdAt: NSDate
}
然后使其遵守ResponseRepresentable
协议:
import HTTP
import Foundation
extension BlogPost: ResponseRepresentable {
func makeResponse() throws -> Response {
let json = try JSON(node:
[
"id": id,
"content": content,
"created-at": createdAt.timeIntervalSince1970
]
)
return try json.makeResponse()
}
}
别忘了添加“import HTTP”
现在我们创建了BlogPost
模型,我们可以在路由处理程序中直接返回了。
drop.post("post") { req in
guard let content = request.data["content"] else { throw Error.missingContent }
let post = Post(content: content)
try post.save(to: database)
return post
}
网友评论