У меня есть API, написанный на Vapor.Я хотел бы следовать спецификации 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)
})
}
IЯ не уверен, как я могу это сделать.Это классы попыток
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
}
}
Нужно ли использовать Generics для настройки класса ответа?Кто-нибудь может привести пример?