我正在设计一个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个不好的请求,无论如何都没关心",我没有需要快速解决的问题或者务实的黑客。谢谢)
答案 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
/ 403
,401
是"您还没有登录"。 403
已经"您已登录,并且您无权执行您想要的操作"。我在使用这些代码时看不到任何异常。
说完这一切之后,我觉得我在某种程度上误解了这个问题。
答案 2 :(得分:1)
我不喜欢404的概念表示无法找到资源的失败删除(或者对于那个问题的put或补丁)。有DNS问题并且人们有基于参数的路由问题是很常见的,如果找不到实际的站点,这两个问题都会产生404。引入这种模糊性可以使诊断简单问题真正地和不必要地困难。我认为,当涉及到API时, 410 Gone是表示未找到资源的更好选择。