【发布时间】:2013-02-14 05:29:54
【问题描述】:
我正在尝试找出 REST 存储的正确响应。我很清楚相关的 RFC 2616;相关部分是9 Method Definitions
现在...
简短的问题:
如果我使用 POST 或 PUT 创建资源,并且不想返回当前资源数据,我应该使用什么代码? 204可以吗? (我怀疑)
我已经在JsonRestStore 中概述了我是如何实现这些方法的:https://github.com/mercmobily/JsonRestStores/blob/master/jsonrest.md
好的,这是更长的版本。
起点:
- PUT CREATES 或 OVERWRITES 资源(取决于资源是否已存在)
- POST CREATES 或 MODIFIES 资源(取决于传递的 ID [以“附加到它”,即“POST 传递特定的 ID”],或未传递 [以创建])
- 商店可能会返回服务器上的资源,或者不返回任何内容
这就是商店经常使用的方式。是的,您可以将资源 ID 传递给 POST——这听起来可能很奇怪,但这样做已经完成了。
问题一:PUT 新资源不返回内容的情况
RFC 说:
如果创建了新资源,源服务器必须通过 201(已创建)响应通知用户代理。如果修改了现有资源,则应发送 200(OK)或 204(No Content)响应代码以指示请求成功完成。
- 案例 1:PUT 正在修改现有资源:
- 200(OK)如果你想返回当前资源
- 204(无内容)如果您想说“OK”而不返回任何内容。
- 案例 2:正在创建新资源
- 201(已创建)如果要返回当前资源
- ???如果您不想退货
那么,如果您创建了一个新资源,但不想将其当前状态返回给服务器,该怎么办?可以返回带有 EMPTY 内容的 201 吗?这不是204的东西吗?但是我不能这样做,因为(根据 RFC)我必须返回 201。
问题2:POST新资源,不返回内容的情况
关于 POST,RFC 不得不说:
POST 方法执行的操作可能不会产生可以由 URI 标识的资源。在这种情况下,200(正常)或 204(无内容)是适当的响应状态,具体取决于响应是否包含描述结果的实体。
如果在源服务器上创建了资源,则响应应该是 201(已创建)并包含描述请求状态并引用新资源的实体,以及 Location 标头(参见第 14.30 节)。
如果我接受第二部分实际上并不适用于 REST 存储,因为 POST 总是会导致以某种方式可访问的资源,我最终会得到:
-
案例 1:现有资源被“附加到”,又名“带有 ID 的 POST”(未创建资源)
- ???如果你想返回当前资源
- ???如果您不想返回当前资源
-
案例 2:正在创建新资源(通常通过不传递 ID)
- 201(已创建)如果要返回当前资源
- ???如果您不想返回当前资源
但是,如果我决定将 RFC“POST 方法执行的操作可能不会导致 (...)”解释为“如果您执行 Post append”,这是一个巨大的延伸,那么我最终会得到:
-
案例 1:现有资源被“附加到”,又名“带有 ID 的 POST”(未创建资源)
- 200(OK)如果你想返回当前资源
- 204(无内容)如果您不想返回当前资源
-
案例 2:正在创建新资源(通常通过不传递 ID)
- 201(已创建)如果要返回当前资源
- ???如果您不想返回当前资源
因此,即使将 RFC 解释为尽可能广泛,我仍然会遇到一个问题:如果我创建了资源,并且不想返回当前的资源数据,应该使用什么代码我用? 204可以吗? (我怀疑)
再见,
佣兵。
【问题讨论】:
标签: http rest protocols http-method