假设系统管理用户。用户通过以下网址公开 - 8 bytes
。通过以下网址公开特定用户 - /users
。用户通过以下网址公开报告 - /users/{id}
。
一项操作包括生成报告。相应的HTTP请求是/users/{id}/reports
上的POST
。但是,在某些条件下,生成的报告与上次生成的报告完全相同。因此,我认为在这种情况下返回最后生成的报告是一种很好的方法。
我也知道在这种情况下,不会创建任何资源。
是否有正确的RESTful方式来处理这种情况?也许返回一个特殊代码?
答案 0 :(得分:3)
是否有正确的RESTful方式来处理这种情况?也许返回一个特殊代码?
退后一步:一个非常直接的方式来处理"创造"用例看起来像
已创建新资源的指示是状态代码:201。 Location响应头描述了新创建的资源的位置。 内容的位置由Content-Location响应标头描述 当前的表示形式是响应的message body(毫不奇怪)。
HTTP/1.1 201 Created
Location: /users/1/reports/a
Content-Location: /users/1/reports/a
...
<representation of the report goes here>
在您的情况下,资源已经存在,那么事情看起来几乎相同。为避免暗示我们已创建新资源,状态代码将更改为200,并且会删除Location标头。
HTTP/1.1 200 OK
Content-Location: /users/1/reports/a
...
<representation of the report goes here>
如果您希望客户端使用先前生成的报告的标识符检索报告表示,那么您应该使用303 See Other
它主要用于允许POST操作的输出将用户代理重定向到选定的资源,因为这样做可以单独识别,添加书签和缓存的形式提供与POST响应相对应的信息,独立于原始请求。
HTTP/1.1 303 See Other
Location: /users/1/reports/a
...
此模式通常称为Post/Redirect/Get