【发布时间】:2019-02-13 09:50:12
【问题描述】:
我有一个用 Vapor 编写的 API。我想遵循 JSON API 规范。
我正在努力理解如何以正确的格式创建我的响应对象。
例如,我希望我的回复具有这样的结构......
{
"links": {
"self": "http://example.com/dish",
"next": "http://example.com/dish?page=2",
"last": "http://example.com/dish?page=10"
},
"data": [{
"title": "Spag Bol",
"course": "main",
"description": "BasGetti",
"price": 3.9900000000000002
},
{
"title": "Ice Cream",
"course": "desert",
"description": "Vanilla",
"price": 0.98999999999999999
}]
}
如果POST到这个端点我可以很简单的返回数据的内容(伪代码)
router.post(Dish.self, at: "api/dish") { req, data -> Future<Dish> in
return Future.map(on: req, { () -> Dish in
data.id = 001
return data
})
}
我尝试创建一个 ApiResponse 类并传入数据,以便我可以构建响应,但这不适用于错误 Cannot convert return expression of type 'ApiResonse' to return type 'Dish'
router.post(Dish.self, at: "api/dish") { req, data -> Future<Dish> in
return Future.map(on: req, { () -> Dish in
data.id = 001
return ApiResonse(links: Links(self: "http://google.com", next: "http://google.com", last: "http://google.com"), data: data)
})
}
我不确定我该怎么做。这些是尝试的类
final class Dish: Content {
var id: Int?
var title: String
var description: String
var course: String
var price: Double
init(title: String, description: String, course: String, price: Double) {
self.title = title
self.description = description
self.course = course
self.price = price
}
}
struct Links {
var `self`: String?
var next: String?
var last: String?
}
class ApiResonse {
var links: Links?
var data: Any
init(links: Links, data: Any) {
self.links = links
self.data = data
}
}
我需要使用泛型来设置响应类吗?有谁可以举个例子吗?
【问题讨论】: