HTTP 429 Too Many Requests

请放慢速度:客户端在时间窗口内发送的请求超过了服务器允许的数量。

HTTP 429 是什么意思

HTTP 429 Too Many Requests 表示客户端超出了速率限制——按 IP、按 API 密钥、按用户或按端点计算。行为规范的服务器会包含 Retry-After 头(秒数或日期),通常还会附带描述配额的 X-RateLimit-* 头。

对客户端而言,正确的反应始终一致:放慢速度。立即重试只会让情况恶化,甚至可能把临时限流升级为封禁。

429 错误的常见原因

  • API 客户端轮询过于频繁,或突发流量超出了配额。
  • 未在请求之间添加延迟的网页抓取。
  • 一个 bug:没有退避机制的重试循环不断轰炸同一个端点。
  • 共享 IP(办公室 NAT、VPN、无服务器出口)的合计流量超出了限制。
  • 登录端点将重复尝试作为暴力破解防护进行限流。

作为客户端/开发者该如何修复

  • 严格遵守 Retry-After;如果缺失,则使用带抖动的指数退避(例如 1 秒、2 秒、4 秒、8 秒……)。
  • 读取 API 的 X-RateLimit-Remaining/重置 头,并主动控制请求节奏。
  • 批量处理请求并缓存响应,而不是重复获取相同的数据。
  • 把负载分散在时间上,而不是分散到临时 IP 上——规避限制通常违反 API 的使用条款。

作为 API 所有者该如何修复

  • 始终发送 Retry-After 和配额相关的响应头,以便客户端能够合理应对。
  • 尽可能按密钥/用户而非单纯按 IP 进行限流,以避免误伤共享网络。

示例响应

HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0

{"error":"rate_limited","retry_after":30}

常见问题

收到 429 后应该等待多久?

按照 Retry-After 所说的时间等待。如果没有该头,先从一两秒开始,每连续遇到一次 429 就将延迟加倍(指数退避)。

429 意味着我被封禁了吗?

不是——这是临时限流。但如果反复无视它,可能会导致真正的 IP 或密钥封禁。

为什么我第一次请求就收到了 429?

限制很可能是共享的:你的 IP(VPN、办公网络)或 API 密钥的配额可能已在别处用尽。