【问题标题】:Returning a 201 (Created) with location header in Vapor 3在 Vapor 3 中返回带有位置标头的 201(已创建)
【发布时间】:2018-12-31 04:19:47
【问题描述】:

我正在尝试使用 Vapor 3 实现一个 REST-ful API,我更喜欢在其他 Web 框架中使用看起来相当标准的创建模式:我希望实体创建控制器返回 201 @ 987654321@ 响应状态,Location 响应标头包含新创建资源的完整 URL。

我能找到的所有 Vapor 3 文档都显示了一个创建模式,该模式改为返回 200 OK 状态,并在响应正文中包含完整资源。但我找不到任何使用 201 响应的示例,尽管根据我的经验,这往往是更标准的 REST-ful API 方法。

我发现我可以在我的控制器中手动创建一个 201 响应,并且我认为有一种方法可以在该响应中设置任意标头。如果是这样,是否有一种方便的方法可以获取我刚刚创建的资源的完整 URL,以便我可以在响应中设置 Location 标头?

我确信我可以通过“蛮力”来获得我想要的东西,但我希望 Vapor 定义了一种惯用的方式来做到这一点,就像我使用的 Java 和 Rails 框架提供的一样。

【问题讨论】:

    标签: vapor


    【解决方案1】:

    由于您是手动创建响应,您是对的,添加任意标题很简单。

    我假设你遵循标准的 CRUD 路由结构,所以如果你有一个 User 模型,你有以下路由:

    • POST /users
    • GET /users/:user
    • PATCH /users/:user
    • DELETE /users/:user

    这里重要的是我们知道获取用户的URL就是创建用户的URL,加上用户的ID。如果是这种情况,我们可以像这样创建一个位置标头:

    user.save(on: req).map { user in
        let http = HTTPResponse(...)
    
        let location = req.http.url.path + "/" + user.id.description
        http.headers.replaceOrAdd(name: "Location", value: location)
    
        return Response(http: http, container: req)
    }
    

    【讨论】:

    • 感谢您的建议。我希望减少手动操作,但我当然可以使用这种方法。我想我已经被 Rails 及其为您定义的资源路由自动创建的路径/URI 助手宠坏了。这种方法虽然有效 - 只要我坚持非常标准的 CRUD 路由结构并且我不需要在多个地方复制这个逻辑就应该没问题。
    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 2020-10-01
    • 2019-11-14
    • 2016-07-16
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多