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

REST-API,无效删除的正确HTTP状态代码,api,http,rest,permissions,http-error,Api,Http,Rest,Permissions,Http Error,我正在设计一个RESTful API,它使用HTTP状态代码和谓词作为通信中的关键组件 在宗教层面上,它是站在RESTafarian的狂热者一边 确定HTTP状态代码的经验法则已被使用,或类似资源 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用户没

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

在宗教层面上,它是站在RESTafarian的狂热者一边

确定HTTP状态代码的经验法则已被使用,或类似资源

  • 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
    用户没有权限,资源已被删除
目标:

  • 使用上的一致性
  • 不通过错误公开私人信息
  • 正确使用客户端或中间层缓存的状态代码
  • 尽早失败,将查找保持在最低限度
在这种情况下,有许多不同的状态代码可供选择(404403410405),在我的例子中,我对现有资源使用403(如果不是您的资源)来不清除缓存,对所有不存在的资源使用404来告诉客户机擦除该数据

但我不喜欢在非您的资源上从403切换到404

我很想从其他人那里听到您是如何解决这个用例的,或者一般来说,您认为在所有无效的删除调用中发送什么状态代码是合适的,因为我认为这是最难简洁的


(互联网上的许多REST讨论和回答都只是“抛出400个错误请求,反正没人关心”,我没有需要快速修复或实用黑客的问题。谢谢)

一般指针:如果资源存在,但用户无权对其执行操作,您应该返回401,而不是403:

401未经授权

类似于403禁止,但专门用于 需要身份验证且已失败或尚未验证时 提供

403禁止

请求是有效的请求,但服务器拒绝响应。与401未经授权的响应不同,身份验证不会产生任何影响

另见


我用403对一个现有的资源,如果它不是你的不清楚 缓存,以及所有不存在的资源上的404,以便告诉 客户端删除该数据

如前所述,应该使用401而不是403。如果您只想说“对不起,找不到资源”,404可以返回。但是,如果您想说“资源曾经在这里,但现在已经不在了,将来也不会再在这里了”(在您的情况下,似乎是这样),您可以返回410:

410不见了

表示请求的资源不再可用 并且将不再可用。这应在以下情况下使用: 已故意删除资源,应删除该资源 清除。收到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

根据情况返回不同的状态代码是完全正确的


我希望这对您有所帮助。

无效删除调用的响应代码取决于失败的原因。就你的情况而言,我同意:

  • 删除/api/documents/1
    -用户有权限
    • 204无内容
  • 删除/api/documents/2
    -用户权限无关,资源不存在
    • 404未找到
  • 删除/api/documents/1
    -用户有权限,资源已删除
    • 410消失了
  • 删除/api/documents/1
    -用户没有权限,资源已被删除
    • 403禁止
最后一个电话是唯一值得一提的。我相信(你的图表也同意)用户没有权限的情况优先于其他情况