【发布时间】:2020-08-26 14:10:04
【问题描述】:
在我的应用程序中,我有一个将在企业版和标准版中启用的功能。在此功能中,我对创建实体有计数限制。两个版本的计数限制相同。超过计数时我应该抛出 403 吗?还是只返回 422 错误代码? 谢谢
【问题讨论】:
-
您可以使用402 - 需要付款
标签: rest error-handling error-code
在我的应用程序中,我有一个将在企业版和标准版中启用的功能。在此功能中,我对创建实体有计数限制。两个版本的计数限制相同。超过计数时我应该抛出 403 吗?还是只返回 422 错误代码? 谢谢
【问题讨论】:
标签: rest error-handling error-code
在我看来,您应该返回 http 状态 406。不可接受。因为这是服务器的当前状态。
403 状态适用于用户登录但没有足够要求在服务器中执行操作的情况。
除了错误 406,您还应该添加一条支付信息或增加当前帐户限制。
【讨论】:
要认识到的重要一点是响应的状态代码是(如标头值)元数据:它是以标准化形式提供的信息,以便通用组件可以理解语义发生了什么。细粒度的细节属于消息正文。
以网络模型为例:如果我们希望浏览器/缓存/反向代理/网络蜘蛛了解正在发生的事情,我们会使用元数据。对于网络的人类读者,响应负载中提供了细粒度的详细信息。
另外,元数据属于transporting documents over a network域;服务器在看起来像网站的外观后面做着有趣的事情。
因为状态代码是为通用组件设计的,所以我们衡量错误代码正确性的主要指标是“通用组件会做正确的事吗?”当它看到它时。
403 在 HTTP/1.1 中有这个含义:
403(Forbidden)状态码表示服务器理解请求但拒绝授权。
“授权”这个词有时会让人绊倒,因为听起来这种状态是特定于凭据的。更仔细的阅读表明并非如此
请求可能因与凭据无关的原因而被禁止。
在HTTP/1.0,语言略有不同
服务器理解请求,但拒绝执行。
403 的意思是“我不会允许你做这件事”,但对于是否允许其他人做这件事含糊其辞。
您可能会考虑的另一种可能性是409 Conflict。
409(冲突)状态码表示由于与目标资源的当前状态冲突,请求无法完成。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应该生成一个有效载荷,其中包含足够的信息让用户识别冲突的来源。
据我所知,这些代码是等价的,因为通用组件的行为方式与每个代码相似。
我不考虑406 Not Acceptable,因为这是一个关于域逻辑的问题,406 是关于proactive negotiation。同样,对于与precondition headers 无关的故障,我不考虑使用412 Precondition Failed。
同样,这里的主题是我们正在 HTTP 域中寻找正确的匹配项。
【讨论】: