当用户超过每日传输限制时,正确的 HTTP 状态代码是什么?

sek*_*mal 2 c# rest http-status-codes http-status-code-403 http-status-code-429

每个用户都有每日信用额度。

如果用户超出每日限制,HTTP 状态代码将显示在此处。

403 -禁止或 200 -成功(带有验证结果)

Kit*_*Kit 5

两者都不。您正在描述速率限制。为此有一个明确的状态代码:429

403是关于安全性,特别是授权……您是否被授权做某事而不考虑频率。403与速率限制正交。可以这样想:如果我要求“将商品添加到购物车”,403我知道我不能,无论这是我在一段时间内的第一次请求还是我的第N次请求。完毕。我知道429我可以(403没有发生或不适用),但我现在也知道我出于某种原因试图太快地做到这一点。

200也不合适:天真的客户端只是假设一切正常,忽略任何其他细节,并默默地让用户失败,错误地认为一切正常,而实际上发生的事情是服务器想说:“我无法处理这个问题现在”。

A429本身就足够了,但是智能客户端还会查找Rety-After标头,精心设计的 API(和 API 客户端)应该实现该标头,以减少服务器和客户端(协作)上的负载。

据推测,如果您知道速率限制是如何被“违反”的,您可以计算出一个Retry-After相当精确的值。您可以查看 Mozilla 文档中Retry-After的格式,它可以以秒为单位或特定的日期/时间。我之前已经这样做过,并添加了一个“捏造因素”,以避免过早出现不必要的新请求。

虽然这种方法的速率限制可能会被不良行为者滥用,但它至少有助于在服务器和客户端的标称速率限制场景中减少网络(和其他)资源利用率。

最后,到底429适合你的场景,但其他状态确实需要考虑。返回, , 400before的调用顺序(我将整个链包括到 API 中,包括代理)可能会有所不同,具体取决于 API 和代理处理的 4xx 错误。理想情况下,最便宜的 4xx 检查首先发生(更靠近客户端)。429403200