“的REST HTTP状态代码”;成功,因此你不再有机会”;

“的REST HTTP状态代码”;成功,因此你不再有机会”;,http,rest,http-status-codes,Http,Rest,Http Status Codes,我的RESTful服务包括一个表示项ACL的资源。要更新此ACL,客户端将以新ACL作为其实体执行PUT请求。成功时,PUTresponse实体包含新ACL的净化规范版本 在大多数情况下,HTTP响应状态代码相当明显200成功后,403如果不允许用户编辑ACL,400如果新ACL格式不正确,404如果他们试图在不存在的项目上设置ACL,412如果如果匹配头不匹配,等等 然而,有一种情况是,正确的HTTP状态代码并不明显。如果经过身份验证的用户使用PUT将自己从ACL中删除,该怎么办?我们需要指出

我的RESTful服务包括一个表示项ACL的资源。要更新此ACL,客户端将以新ACL作为其实体执行
PUT
请求。成功时,
PUT
response实体包含新ACL的净化规范版本

在大多数情况下,HTTP响应状态代码相当明显
200
成功后,
403
如果不允许用户编辑ACL,
400
如果新ACL格式不正确,
404
如果他们试图在不存在的项目上设置ACL,
412
如果
如果匹配
头不匹配,等等

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

我考虑过在
PUT
实体中使用新ACL返回
200
,但这没有任何迹象表明他们不再有能力
获取资源。我考虑过直接返回
403
,但这并不表示
PUT
成功。我曾经考虑过返回
303
,而
位置
指向同一个资源(随后的
GET
将给出
403
),但鉴于资源没有移动,这似乎是对
303
的滥用


那么“成功,因此您不再有访问权限”的正确REST HTTP状态代码是什么呢?

非常有趣的问题:-)这就是为什么我喜欢REST,有时它可能会让您发疯。阅读时,我会选择(这当然只是我的拙见)其中之一:

  • 202已接受-因为这意味着“是的,我收到了你的请求,我会处理它,但稍后会回来看看会发生什么”-当用户稍后回来时,她会得到403(这应该是预期的行为)
  • 205重置内容-“是的,我知道你想删除自己,请提出新的请求,当你回来时,你会得到403”
另一方面(在我脑海中突然出现),为什么你要引入一个单独的逻辑并区分这种情况,而不是使用200?其余部分是否将从某个具有UI的客户端应用程序中使用?rest的用户应该向最终用户显示一个弹出窗口“您确定要将自己从ACL中删除吗?”如果rest返回200并只显示一个弹出窗口“您确定要从ACL中删除名为的用户吗?”,则可以处理此情况,无需区分这两种情况。如果此rest将用于某些服务到服务的通信(即,仅从另一个程序调用),那么您为什么还要在此处区分这些情况?程序将不关心将从ACL中删除哪个用户


希望这会有所帮助。

您可能希望查看HTTP响应代码“204 No Content”(),这表示“服务器已完成请求[从ACL中删除],但不需要返回实体正文,并且可能希望返回更新的元信息”(此处是成功删除的结果)。尽管不允许返回包含204的消息正文,但可以返回实体头,指示用户对资源访问的更改。我从Amazon S3得到了这个想法-成功的删除请求()会返回204,这似乎与您的情况相似,因为从ACL中删除您自己,您已经阻止了将来对该资源的访问。

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


你应该读这本书;它不仅讨论了200/204的使用,而且在仔细阅读时指出,立即响应PUT返回转换的表示是不合适的;相反,使用ETag或Last Modified标头来指示客户端发送的实体是否已转换。如果是,客户机应该发出一个后续GET,而不是期望发送新的表示以响应PUT,如果没有其他原因,只是为了在过程中更新任何缓存(因为对PUT的响应是不可缓存的)。同意:对PUT的响应应该表示操作的状态,而不是资源本身。还要注意,对于新的ACL,必须返回201,而不是200。

您混淆了两个语义概念,并试图将它们组合成一个响应代码

第一个:您在尝试创建的位置成功创建了ACL。正确的语义响应(在RESTful或非RESTful场景中)是创建的201。来自RFC:“请求已完成,并导致创建新资源。”

第二:执行PUT的用户不再有权访问此资源。这是一个暂时的想法-如果ACL更新了,或者在下一个请求之前发生了更改,该怎么办?用户无权访问任何类型的资源(包括ACL资源)的想法只与该请求的范围有关。在执行下一个请求之前,可能会发生一些变化。在用户无权访问某个内容的单个请求中,您应该返回一个403禁止的

您的PUT方法应该返回一个201。如果客户担心自己是否还有访问权限,那么