错误码

概述

本文档详细说明了 ZGI API 中的错误码定义、含义和处理建议。所有的 API 响应都遵循统一的错误处理格式,便于开发者进行错误处理和问题排查。

响应格式

成功响应

{
    "status_code": 200,
    "status_message": "SUCCESS",
    "data": {
        // 具体的响应数据
    }
}

错误响应

{
    "status_code": 400,
    "status_message": "BAD_REQUEST",
    "error": {
        "code": "INVALID_PARAMETER",
        "message": "参数无效",
        "details": {
            "field": "email",
            "reason": "格式不正确"
        }
    }
}

HTTP 状态码

2xx - 成功

状态码 说明 使用场景
200 请求成功 常规成功响应
201 创建成功 资源创建成功
202 已接受 异步任务已接受
204 无内容 删除成功

4xx - 客户端错误

状态码 说明 使用场景
400 请求参数错误 参数格式、类型错误
401 未授权 缺少认证信息或认证失败
403 权限不足 无权访问资源
404 资源不存在 请求的资源未找到
409 资源冲突 资源已存在或状态冲突
429 请求过于频繁 超出速率限制

5xx - 服务端错误

状态码 说明 使用场景
500 服务器内部错误 服务器异常
502 网关错误 上游服务异常
503 服务不可用 服务维护或过载
504 网关超时 上游服务超时

业务错误码

通用错误 (10xxx)

错误码 说明 处理建议
10000 系统内部错误 联系技术支持
10001 参数无效 检查请求参数
10002 资源不存在 确认资源标识符
10003 操作不允许 检查操作权限
10004 请求过于频繁 控制请求频率

认证错误 (11xxx)

错误码 说明 处理建议
11001 认证失败 检查认证信息
11002 令牌过期 刷新访问令牌
11003 令牌无效 重新登录获取令牌
11004 权限不足 申请所需权限
11005 账号被锁定 联系管理员解锁

组织错误 (12xxx)

错误码 说明 处理建议
12001 组织不存在 检查组织 ID
12002 组织已存在 使用其他名称
12003 成员已存在 检查成员信息
12004 成员不存在 确认成员身份
12005 角色无效 检查角色设置

项目错误 (13xxx)

错误码 说明 处理建议
13001 项目不存在 检查项目 ID
13002 项目已存在 使用其他名称
13003 项目已归档 检查项目状态
13004 资源超限 升级资源配额
13005 配置无效 检查项目配置

API 密钥错误 (14xxx)

错误码 说明 处理建议
14001 密钥不存在 检查密钥 ID
14002 密钥已过期 创建新密钥
14003 密钥已禁用 启用或更新密钥
14004 超出密钥限制 删除未使用密钥
14005 权限设置无效 检查权限配置

账单错误 (15xxx)

错误码 说明 处理建议
15001 余额不足 充值账户
15002 支付失败 检查支付信息
15003 订单无效 重新创建订单
15004 账单周期无效 检查日期范围
15005 价格方案无效 确认价格方案

错误处理最佳实践

1. 错误检查

try {
    const response = await client.organizations.create({
        name: 'My Organization'
    });
} catch (error) {
    if (error.status === 400) {
        console.error('参数错误:', error.error.details);
    } else if (error.status === 409) {
        console.error('组织名称已存在');
    } else {
        console.error('创建组织失败:', error.message);
    }
}

2. 错误重试

async function retryRequest(fn, maxRetries = 3) {
    let retries = 0;
    while (retries < maxRetries) {
        try {
            return await fn();
        } catch (error) {
            if (error.status === 429) {
                // 等待并重试
                const delay = Math.pow(2, retries) * 1000;
                await new Promise(resolve => setTimeout(resolve, delay));
                retries++;
            } else {
                throw error;
            }
        }
    }
    throw new Error('超出最大重试次数');
}

3. 错误日志

function logError(error) {
    const errorLog = {
        timestamp: new Date().toISOString(),
        status: error.status,
        code: error.error?.code,
        message: error.message,
        details: error.error?.details
    };
    
    // 记录错误日志
    console.error('API错误:', errorLog);
    
    // 可以将日志发送到日志服务
    // await logService.send(errorLog);
}

常见问题

1. 如何处理 429 错误?

  • 实现请求重试机制
  • 使用指数退避策略
  • 监控请求频率
  • 优化请求策略

2. 如何处理认证错误?

  • 检查认证信息
  • 实现令牌刷新
  • 处理会话过期
  • 提供重新登录选项

3. 如何优化错误提示?

  • 提供清晰错误信息
  • 给出具体解决建议
  • 支持多语言错误提示
  • 记录详细错误日志

更新日志

v1.1.0 (2024-02-01)

  • 新增业务错误码
  • 完善错误处理建议
  • 增加代码示例

v1.0.0 (2024-01-01)

  • 基础错误码定义
  • HTTP 状态码说明
  • 错误响应格式规范