我正在尝试使用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>
答案 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)
}