不创建资源的POST

时间:2016-12-01 17:18:08

标签: rest http

假设系统管理用户。用户通过以下网址公开 - 8 bytes。通过以下网址公开特定用户 - /users。用户通过以下网址公开报告 - /users/{id}

一项操作包括生成报告。相应的HTTP请求是/users/{id}/reports上的POST。但是,在某些条件下,生成的报告与上次生成的报告完全相同。因此,我认为在这种情况下返回最后生成的报告是一种很好的方法。

我也知道在这种情况下,不会创建任何资源。

是否有正确的RESTful方式来处理这种情况?也许返回一个特殊代码?

1 个答案:

答案 0 :(得分:3)

  

是否有正确的RESTful方式来处理这种情况?也许返回一个特殊代码?

退后一步:一个非常直接的方式来处理"创造"用例看起来像

  1. 客户端将请求发送到/ users / 1 / reports
  2. 源服务器创建新资源并计算此资源的新标识符(/ users / 1 / reports / a)
  3. 服务器返回一个响应,指示已创建新资源,该资源的位置及其当前表示。
  4. 已创建新资源的指示是状态代码:201Location响应头描述了新创建的资源的位置。 内容的位置由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