“的REST HTTP状态代码”;成功,因此你不再有机会”;
我的RESTful服务包括一个表示项ACL的资源。要更新此ACL,客户端将以新ACL作为其实体执行“的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中删除,该怎么办?我们需要指出
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。如果客户担心自己是否还有访问权限,那么