假设我有一个名为Estimate
的模型。我有一个Vapor 3 API,我想返回这些模型的列表,并按查询参数进行过滤。当前这样做会返回Future<[Estimate]>
,这将导致API返回如下所示的JSON:
[{estimate object}, {estimate object}, ...]
相反,我想让它返回以下内容:
{"estimates": [{estimate object}, {estimate object}, ...]}
因此,与以前相同,但是使用单个键"estimates"
将其包装在JSON对象中。
According to the documentation,每当我想返回非默认值时,都应该为其创建一个新类型;这对我来说建议我创建一个像这样的类型:
final class EstimatesResponse: Codable {
var estimates: [Estimate]?
}
但是,在过滤之后,我得到了一个Future<[Estimate]>
而不是一个纯[Estimate]
数组,这意味着我无法将其分配给我的EstimatesResponse
estimates
属性。将estimates
的类型设为Future<[Estimate]>
似乎很奇怪,我不确定结果如何。
那么,如何才能返回正确格式的JSON?
答案 0 :(得分:3)
首先,您需要创建Codable对象,我更喜欢以下结构。必须实现协议 Content 进行路由。
struct EstimatesResponse: Codable {
var estimates: [Estimate]
}
extension EstimatesResponse: Content { }
我假设您正在使用控制器,并且在控制器内部,可以使用以下伪代码。调整代码,使 val 为未来<[Estimate]> ,然后使用 flatmap / map 获得 [Estimate] 强>。
func getEstimates(_ req: Request) throws -> Future<EstimatesResponse> {
let val = Estimate.query(on: req).all()
return val.flatMap { model in
let all = EstimatesResponse(estimates: model)
return Future.map(on: req) {return all }
}
}