【问题标题】:How to handle a POST request for one to many relationship in Vapor 3.0?如何在 Vapor 3.0 中处理一对多关系的 POST 请求?
【发布时间】:2018-10-26 16:43:26
【问题描述】:

正在尝试为以下请求编写请求处理程序:

POST -> /properties/{:propertyId}/issues

处理程序应使用propertyId 为属性创建一个新问题。

我已经像这样注册了路线:

router.post(Issue.self, at: "properties", Int.parameter, "issues", use: createIssueHandler)

如何编写处理程序以从请求参数中获取propertyId,而不是在 JSON 正文中要求它?

func createIssueHandler(_ req: Request, data: Issue) throws -> Future<Issue> {
    let propertyId = try req.parameters.next(Int.self)
    let issue = Issue(
        title: data.title, 
        description: data.description,
        propertyId: propertyId
    )
    return issue.save(on: req)
}

【问题讨论】:

    标签: swift rest vapor


    【解决方案1】:

    感谢 Vapor 的 Discord 聊天中的 @AxelCB

    如果Property符合Parameter,你可以这样做:

    router.post(Issue.self, at: "properties", Property.parameter, "issues", use: createIssueHandler)
    
    func createIssueHandler(_ req: Request, data: Issue) throws -> Future<Issue> {
        try req.parameters.next(Property.self).flatMap(to: Issue.self) { property -> Future<Issue> in
            data.propertyId = property.id
            return issue.save(on: req)
        }
    }
    

    如果您在parameters.next 中发送的是一个模型,并且下一个参数与该模型的 ID 类型相同,它会尝试使用该 ID 查找您的模型,如果找不到则抛出一些错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2021-01-08
      • 2022-01-21
      相关资源
      最近更新 更多