蒸气3 API:在响应对象中嵌入Future <model>

时间:2018-10-21 23:50:07

标签: swift vapor

假设我有一个名为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?

1 个答案:

答案 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 }
        }
    }