我正在尝试找出 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可以吗?( 我对此表示怀疑)
再见,
默克。