正确的REST存储返回码

时间:2013-02-28 05:59:06

标签: http rest protocols http-method

我正在尝试找出REST商店的正确响应。我很清楚相关的RFC 2616;相关部分是9 Method Definitions

现在......

简短的问题:

如果我使用POST或PUT创建资源,并且不想返回当前资源数据,我应该使用什么代码? 204好吗? (我对此表示怀疑)

我已在此处JsonRestStore中概述了我如何实施这些方法:https://github.com/mercmobily/JsonRestStores/blob/master/jsonrest.md

好的,这是更长的版本。

起点:

  • PUT要么创建资源,要么覆盖资源(取决于资源是否已经存在)
  • POST创建或修改资源(取决于传递的ID [to“追加到它”,即“POST传递特定ID”],或者不传递[创建])
  • 商店MIGHT返回服务器上的资源,或返回NO内容

这就是商店经常使用的方式。是的,您可以将资源ID传递给POST - 这可能听起来很奇怪,但是这样做了。

问题1:在没有返回内容的情况下放置新资源的情况

RFC说:

  

如果创建了新资源,源服务器必须通过201(已创建)响应通知用户代理。如果修改了现有资源,则应该发送200(OK)或204(No Content)响应代码以指示请求成功完成。

  • 案例1:PUT修改现有资源:
    • 200(确定)如果要返回当前资源
    • 204(无内容)如果您想说“OK”而不返回任何内容。
  • 案例2:正在创建新资源
    • 201(已创建),如果要返回当前资源
    • ???如果你不想归还任何东西

那么,如果您创建了一个新资源,但又不想将其当前状态返回给服务器呢?可以使用EMPTY内容返回201吗?那不是204的东西吗?但是我不能这样做,因为(根据RFC)我必须返回201.

问题2:POST新资源但不返回内容的情况

关于POSTing,RFC必须说:

  

POST方法执行的操作可能不会产生可由URI标识的资源。在这种情况下,200(OK)或204(No Content)是适当的响应状态,具体取决于响应是否包含描述结果的实体。

     

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含一个描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节)。

如果我接受第二部分实际上并不适用于REST存储,因为POST总是会产生一个可以某种方式访问​​的资源,我最终得到:

  • 案例1:现有资源被“追加”,AKA“POST with ID”(资源未创建)

    • ???如果要返回当前资源
    • ???如果您不想返回当前资源
  • 案例2:正在创建新资源(通常是通过NOT传递ID)

    • 201(已创建),如果要返回当前资源
    • ???如果您不想返回当前资源

但是,如果我决定解释RFC“POST方法执行的操作可能不会导致(...)”为“如果你做一个帖子追加”,这是一个huuuuge延伸,那么我最终得到:

  • 案例1:现有资源被“追加”,AKA“POST with ID”(资源未创建)

    • 200(确定)如果要返回当前资源
    • 204(无内容)如果您不想返回当前资源
  • 案例2:正在创建新资源(通常是通过NOT传递ID)

    • 201(已创建),如果要返回当前资源
    • ???如果您不想返回当前资源

因此,即使将RFC解释为广泛,我仍然会得到一个问题:如果我创建资源,并且不想返回当前资源数据,那么代码应该是什么我用? 204好吗? (我对此表示怀疑)

再见,

Merc的。

2 个答案:

答案 0 :(得分:0)

我总是返回201,你被告知你必须退回一个。

请注意您自己的引用:

  

并包含描述请求状态的实体

请注意,表示您必须将资源作为内容包含在内。只是描述状态的实体。但如果只有一种可能的状态,我认为没有内容没有问题。

答案 1 :(得分:0)

您可能需要检查HTTP / 1.1修订版(正在进行中),特别是http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-22.html#header.content-location