2

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

现在...

简短的问题:

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

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

好的,这是更长的版本。

起点:

  • PUT CREATES 或 OVERWRITES 资源(取决于资源是否已经存在)
  • POST CREATES 或 MODIFIES 资源(取决于传递的 ID [到“附加到它”,即“POST 传递特定 ID”],或未传递 [到创建])
  • 商店可能会返回服务器上的资源,或者不返回任何内容

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

问题一:PUTting a NEW 资源而不返回内容的情况

RFC 说:

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

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

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

问题2:POST一个NEW资源,不返回内容的情况

关于 POST,RFC 不得不说:

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

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

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

  • 案例 1:现有资源被“附加到”,又名“带有 ID 的 POST”(未创建资源)

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

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

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

  • 案例 1:现有资源被“附加到”,又名“带有 ID 的 POST”(未创建资源)

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

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

因此,即使尽可能广泛地解释 RFC ,我仍然会遇到一个问题:如果我创建了资源,并且不想返回当前的资源数据,我应该使用什么代码?204可以吗?( 我对此表示怀疑)

再见,

默克。

4

2 回答 2

0

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

于 2013-02-28T07:35:47.527 回答
0

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

请注意您自己的报价:

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

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

于 2013-02-28T07:07:54.240 回答