REST-API,无效DELETE的正确HTTP状态代码

时间:2014-05-06 06:00:53

标签: api http rest permissions http-error

我正在设计一个RESTful API,它使用HTTP状态代码和动词作为沟通的关键组件。

在宗教层面上它是RESTafarian的狂热者。

决定HTTP状态代码的经验法则是this graph或类似的资源。

  • GET /api/documents/1 - 401用户尚未登录
  • GET /api/documents/1 - 200用户有权限
  • GET /api/documents/1 - 403用户无权限
  • DELETE /api/documents/1 - 204用户有权限
  • DELETE /api/documents/1 - 403用户无权限
  • GET /api/documents/2 - 404用户权限不相关,资源不存在
  • DELETE /api/documents/2 - 404用户权限不相关,资源不存在
  • DELETE /api/documents/1 - 404用户拥有权限,资源已被删除
  • DELETE /api/documents/1 - 404用户没有权限,资源已被删除

目标:

  • 使用一致性
  • 不通过错误公开私人信息
  • 正确使用客户端或中间层缓存的状态代码
  • 提前失败,将查询保持在最低限度

在这种情况下,有很多不同的状态代码可供选择(404,403,410,405),在我的情况下,我在现有资源上使用403,如果它不是你不清除缓存,而404在所有非现有资源上,以告诉客户擦除该数据。

但我不喜欢在不属于你的资源上从403切换到404.

我有兴趣听听别人如何解决这个用例,或者一般情况下你认为适合发送所有无效DELETE调用的状态代码,因为我认为这是最难简洁的一个用。

(很多REST讨论和互联网上的答案都只是"扔了400个不好的请求,无论如何都没关心",我没有需要快速解决的问题或者务实的黑客。谢谢)

3 个答案:

答案 0 :(得分:14)

常规指针:如果资源存在但用户无权对其执行操作,则应该通过403返回401:

  

401未经授权

     

类似于403 Forbidden,但专门用于使用   当需要身份验证并且已经失败或尚未验证时   提供。

  

403 Forbidden

     

请求是有效请求,但服务器拒绝响应它。与401 Unauthorized响应不同,身份验证不会有任何区别。

另见Correct HTTP status code when resource is available but not accessible because of permissions


  

我在现有资源上使用了403,如果不是你不清楚的话   缓存,以及所有非现有资源上的404,以便告诉   客户要擦除这些数据。

如前所述,应该使用401而不是403.如果您只想说“抱歉,资源未找到”,则可以返回404。如果你想说“资源在这里,但它不再存在而且永远不会”(在你的情况下似乎就是这种情况)你可以返回410:

  

410 Gone

     

表示请求的资源不再可用   并且将无法再次使用。这应该在a时使用   资源已被故意删除,资源应该是   清除。收到410状态代码后,客户端不应该   将来再次请求资源。客户如搜索   引擎应该从索引中删除资源


总结一下,这是我在你的情况下实现它的方式。我所做的更改是粗体

  • GET /api/documents/1 - 401用户尚未登录
  • GET /api/documents/1 - 200用户有权限
  • GET /api/documents/1 - 401 用户没有权限
  • DELETE /api/documents/1 - 204用户有权限
  • DELETE /api/documents/1 - 403 用户无权限
  • GET /api/documents/2 - 404用户权限不相关,资源不存在
  • DELETE /api/documents/2 - 404用户权限不相关,资源不存在
  • DELETE /api/documents/1 - 410 用户拥有权限,资源已被删除
  • DELETE /api/documents/1 - 401 用户没有权限,资源已被删除

对于最后一个,如果您不希望未经授权的用户知道有资源已被删除,您可以返回401。如果你不在乎你可以返回410.那是由你来决定的。

  

我不喜欢在不属于你的资源上从403切换到404.

根据具体情况,返回不同的状态代码是完全可以的。

我希望这会对你有所帮助。

答案 1 :(得分:3)

无效删除调用的响应代码取决于失败的原因。在你的情况下,我会选择:

  • DELETE /api/documents/1 - 用户有权限
    • 204 No Content
  • DELETE /api/documents/2 - 用户权限无关,资源不存在
    • 404 Not Found
  • DELETE /api/documents/1 - 用户拥有权限,资源已被删除
    • 410 Gone
  • DELETE /api/documents/1 - 用户没有权限,资源已被删除
    • 403 Forbidden

最后一次电话是唯一一个真正值得谈论的电话。我相信(并且您的图表同意)用户缺少权限优先于已经删除的资源。如果用户获得410,那么您将泄露信息(资源已被删除)。

至于401 / 403401是"您还没有登录"。 403已经"您已登录,并且您无权执行您想要的操作"。我在使用这些代码时看不到任何异常。

说完这一切之后,我觉得我在某种程度上误解了这个问题。

答案 2 :(得分:1)

我不喜欢404的概念表示无法找到资源的失败删除(或者对于那个问题的put或补丁)。有DNS问题并且人们有基于参数的路由问题是很常见的,如果找不到实际的站点,这两个问题都会产生404。引入这种模糊性可以使诊断简单问题真正地和不必要地困难。我认为,当涉及到API时, 410 Gone是表示未找到资源的更好选择