错误码与频率限制

HTTP 状态码

状态码含义怎么处理
200请求已处理仍需检查 ok 字段
400参数错误message 修正入参,重试无用
401密钥无效 / 缺失,或账号已停用认证
403无权限,或引用了不属于你的资源确认资源归属;部分功能需要对应套餐
404资源不存在,或不属于你两种情况返回相同,核对 ID
429请求过于频繁退避后重试,见下
5xx服务端异常退避重试;持续出现请提工单
为什么「不存在」和「不属于你」返回一样? 这是刻意的。如果两者可区分,任何人都能靠遍历 ID 探出系统里存在哪些资源 —— 那本身就是一种信息泄露。

该重试和不该重试

状态码重试说明
429 502 503 504✅ 指数退避临时状况
500⚠️ 最多一两次可能是稳定复现的服务端问题
400 401 403 404❌ 不要重试重试多少次结果都一样,只会更快触发限流

频率限制

接口有全局频率限制,超限返回 429。建议:

import time, requests

def call_with_retry(method, path, tries=5, **kw):
    delay = 1
    for i in range(tries):
        r = S.request(method, BASE + path, timeout=20, **kw)
        if r.status_code in (429, 502, 503, 504) and i < tries - 1:
            time.sleep(delay)
            delay *= 2                      # 指数退避
            continue
        d = r.json()
        if not d.get("ok"):
            raise RuntimeError(f"{path}: {d.get('message')} (HTTP {r.status_code})")
        return d
    raise RuntimeError(f"{path}: 重试 {tries} 次仍失败")