在蒸气3中返回带有位置标头的201(已创建)

时间:2018-12-31 04:19:47

标签: vapor

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

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

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

我敢肯定,有一些方法可以“蛮力”实现我想要的东西,但我希望Vapor定义一种惯用的方式来做到这一点,就像我使用的Java和Rails框架提供的那样。 / p>

1 个答案:

答案 0 :(得分:2)

由于您是手动创建响应,因此,添加任意标头很简单。

我假设您遵循标准的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)
}