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

Cle*_*ric 14 api permissions rest http 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用户没有权限
  • 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个糟糕的请求,无论如何都不关心",我没有需要快速修复或务实破解的问题.谢谢)

Tim*_*Tim 14

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

401未经授权

与403 Forbidden类似,但专门用于需要身份验证且已失败或尚未提供的情况.

403禁止

请求是有效请求,但服务器拒绝响应它.与401 Unauthorized响应不同,身份验证不会产生任何影响.

另请参阅资源可用但由于权限无法访问时更正HTTP状态代码


我在现有资源上使用了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.

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

我希望这能帮到你一点点.


Eri*_*ein 5

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

  • 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是“您已登录,但无权做您想做的事”。我看不出你对这些代码的使用有什么异常。

说了这么多,我觉得我在某种程度上误解了这个问题。