Skip to content

分页与错误

成功响应

所有成功响应都使用相同外层结构:

json
{
  "data": {},
  "meta": {
    "api_version": "v1"
  }
}

列表接口的 meta 改为分页信息:

json
{
  "page": 1,
  "limit": 20,
  "total": 125,
  "total_pages": 7
}

page 默认 1;limit 默认 20、最大 50。非法或小于 1 的值会回退到默认值,超过 50 会截断为 50。

错误响应

json
{
  "error": {
    "code": "invalid_token",
    "message": "访问令牌无效或已撤销。",
    "details": []
  }
}

details 只在存在额外校验信息时出现。客户端应以 HTTP 状态和稳定的 error.code 分支,不要依赖中文 message 文案。

常见状态

HTTP常见 code处理建议
400invalid_jsoninvalid_fieldinvalid_idempty_update修正请求格式或字段
401missing_tokeninvalid_tokenexpired_token检查 Bearer 头,必要时创建新 Key
403insufficient_scopeuser_mismatchaccount_restricted检查 Scope、账号 UUID 或账号状态
404card_not_founddeck_not_found检查 ID、分享标识和可见性
405method_not_allowed使用端点允许的方法
413payload_too_large把 JSON 正文缩小到 64 KB 以内
422invalid_deckunknown_card_idinvalid_card_back显示 details 并修正业务数据
500internal_error稍后重试;不要无限快速重试

建议的错误处理

js
async function apiRequest(url, options) {
  const response = await fetch(url, options)
  const payload = await response.json()

  if (!response.ok) {
    const error = new Error(payload.error?.message || `HTTP ${response.status}`)
    error.code = payload.error?.code || 'unknown_error'
    error.details = payload.error?.details
    throw error
  }

  return payload
}

4295xx 可使用带上限的指数退避;对 400401403422 不应原样自动重试。