JSON是Vapor的一个不可分割的部分。它能提供Vapor的配置(Config),并且在请求和响应中都很容易使用。
请求(Request)
在request.data
中,JSON是自动提供的,同时还有表单URL编码、表单数据和查询数据。这使您可以专注于制作一个很棒的API,而不必担心将会发送什么内容类型的数据。
drop.get("hello") { request in
guard let name = request.data["name"]?.string else {
throw Abort(.badRequest)
}
return "Hello, \(name)!"
}
这将返回对任何HTTP方法或内容类型的欢迎,其中包括name
,包括JSON。
只有JSON(JSON Only)
要特别针对JSON,请使用request.json
属性。
drop.post("json") { request in
guard let name = request.json?["name"]?.string else {
throw Abort(.badRequest)
}
return "Hello, \(name)!"
}
响应(Response)
要使用JSON响应,只需创建一个JSON
对象并向其添加值。
rop.get("version") { request in
var json = JSON()
try json.set("version", 1.0)
return json
}
可转换(Convertible)
使您的类和结构的JSON可转换是一种很好的方式与api以一种有组织和DRY的方式进行交互。
能被描绘的(Representable)
当某个对象继承JSONRepresentable
时,它就可以转换为JSON。
extension User: JSONRepresentable {
func makeJSON() throws -> JSON {
var json = JSON()
try json.set("id", id)
try json.set("name", name)
try json.set("age", age)
return json
}
}
现在您可以简单地在您的路由中返回user.makeJSON()
。
drop.get("users", User.parameter) { req in
let user = try req.parameters.next(User.self)
return try user.makeJSON()
}
您甚至可以更进一步,将您的模型与ResponseRepresentable
相一致。因为它已经是JSONRepresentable
,所以您就可以获得自由的一致性。
extension User: ResponseRepresentable { }
现在您可以自己返回模型了。它将自动调用.makeJSON()
。
drop.get("users", User.parameter) { req in
let user = try req.parameters.next(User.self)
return try user
}
初始化(Initializable)
当某个对象继承JSONInitializable
时,它可以从JSON创建。
extension User: JSONInitializable {
convenience init(json: JSON) throws {
try self.init(
name: json.get("name"),
age: json.get("age")
)
}
}
现在您可以简单地调用User(json: ...)
来从json创建用户。
drop.post("users") { req in
guard let json = req.json else {
throw Abort(.badRequest)
}
let user = try User(json: json)
try user.save()
return user
}