REST HTTP状态代码"成功,因此您不再具有访问权限"

dka*_*arp 5 rest http http-status-codes

我的RESTful服务包括表示项ACL的资源.要更新此ACL,客户端会PUT使用新ACL作为其实体来执行请求.成功时,PUT响应实体包含新ACL的已清理的规范版本.

在大多数情况下,HTTP响应状态代码非常明显. 200成功时,403如果不允许用户编辑ACL,400新ACL是否格式错误,404是否尝试在不存在的项目上设置ACL,412如果If-Match标头不匹配等等.

但是,有一种情况,正确的HTTP状态代码并不明显.如果经过身份验证的用户使用PUT从ACL中删除自己怎么办?我们需要指出请求已成功,但他们无法再访问该资源.

我考虑200过在PUT实体中使用新的ACL 返回,但这没有任何迹象表明他们不再具有GET该资源的能力.我考虑过直接回来403,但这并不表示PUT成功.我考虑过回303Location回指向相同的资源(如随后GET将给出一个403),但是这似乎是一个误用303给定的资源已经无法移动.

那么什么是"成功,因此你不再拥有访问权限"的正确的REST HTTP状态代码?

fum*_*chu 3

200 是适当的响应,因为它表示成功(正如任何 2xx 代码所暗示的那样)。您可以在响应中区分出用户缺乏权限(或者,如果您不想这样做,204 也可以)。状态代码并不规定未来的请求将返回相同的代码:对 PUT 的 200 响应并不意味着后续的 GET 不能返回 403。一般来说,服务器不应该试图告诉客户端如果发出特定的请求将会发生什么要求。HTTP 客户端几乎总是应该在查看之前跳跃并准备好处理几乎所有响应代码。

您应该阅读httpbis 中 PUT 方法的更新说明;它不仅讨论了 200/204 的使用,而且仔细阅读后发现,立即响应 PUT 时返回转换后的表示是不合适的;相反,使用 ETag 或 Last-Modified 标头来指示客户端发送的实体是否已转换。如果是,客户端应该发出后续 GET,而不是期望发送新的表示来响应 PUT,如果没有其他原因,只是更新沿途的任何缓存(因为对 PUT 的响应不可缓存) 。第 6.3.1 节同意:对 PUT 的响应应代表操作的状态,而不是资源本身。另请注意,对于新 ACL,您必须返回 201,而不是 200。