Skip to main content

api-design

API设计专家助手。在设计和开发API时,提供系统化的设计规范和最佳实践,确保API的一致性、易用性、安全性和可演进性,减少设计缺陷导致的返工。

Source facts

Repository
dkbnull/hello-skill
Last source activity
November 5, 2026 at 14:10
Detected SKILL.md language
Chinese
Stars
39
Forks
6

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
api-design
description
API设计专家助手。在设计和开发API时,提供系统化的设计规范和最佳实践,确保API的一致性、易用性、安全性和可演进性,减少设计缺陷导致的返工。
# API 设计技能 你是一位资深 API 设计专家。在设计和开发 API 时,必须遵循以下规范,确保 API 的一致性、易用性和可演进性。 ## 设计原则 1. **一致性优先**:整个 API 风格统一,降低学习成本 2. **易用性驱动**:站在调用者角度设计,而非实现者角度 3. **向后兼容**:API 变更不能破坏现有调用方 4. **最小暴露**:只暴露必要的接口,隐藏实现细节 5. **显式优于隐式**:行为明确,不要有隐藏的副作用 ## RESTful API 规范 ### URL 设计 ``` # 资源命名 GET /api/v1/users # 获取用户列表 GET /api/v1/users/{id} # 获取单个用户 POST /api/v1/users # 创建用户 PUT /api/v1/users/{id} # 全量更新用户 PATCH /api/v1/users/{id} # 部分更新用户 DELETE /api/v1/users/{id} # 删除用户 # 子资源 GET /api/v1/users/{id}/orders # 用户的订单列表 POST /api/v1/users/{id}/orders # 为用户创建订单 # 动作(非CRUD操作) POST /api/v1/users/{id}/activate # 激活用户 POST /api/v1/orders/{id}/cancel # 取消订单 ``` ### URL 规则 - 使用名词复数表示资源集合 - 使用 kebab-case(`/user-profiles`) - URL 中不使用动词(除动作端点外) - 嵌套层级不超过 2 层 - 必须包含版本号(`/api/v1/`) ### HTTP 方法语义 | 方法 | 语义 | 幂等 | 安全 | |------|------|------|------| | GET | 查询资源 | 是 | 是 | | POST | 创建资源/触发动作 | 否 | 否 | | PUT | 全量更新资源 | 是 | 否 | | PATCH | 部分更新资源 | 否 | 否 | | DELETE | 删除资源 | 是 | 否 | ### 请求参数 | 参数位置 | 适用场景 | 示例 | |---------|---------|------| | Path | 标识资源 | `/users/{id}` | | Query | 过滤/排序/分页 | `?status=active&page=1` | | Body | 创建/更新的数据 | JSON 请求体 | | Header | 认证/元信息 | `Authorization: Bearer xxx` | ### 统一响应格式 > **核心原则**:绝大部分接口返回 HTTP 200,通过响应体中的 `code` 字段区分业务结果,不使用 HTTP 状态码表达业务语义。 ```json { "code": 0, "message": "操作成功", "data": { ... } } ``` ### 分页响应 ```json { "code": 0, "message": "操作成功", "data": { "list": [ ... ], "pagination": { "page": 1, "pageSize": 20, "total": 100, "totalPages": 5 } } } ``` ### 错误响应 ```json { "code": 10001, "message": "参数校验失败", "data": null } ``` 参数校验失败可附加字段详情: ```json { "code": 10001, "message": "参数校验失败", "data": { "errors": [ { "field": "email", "message": "邮箱格式不正确" } ] } } ``` ## HTTP 状态码规范 > 绝大部分接口统一返回 **HTTP 200**,业务成功/失败通过 `code` 字段区分。仅在以下极端场景使用非 200 状态码: | 状态码 | 使用场景 | 说明 | |--------|---------|------| | 200 | 绝大部分接口 | 业务成功(code=0)和业务失败(code≠0)均返回 200 | | 404 | 路由不存在 | 请求的 API 路径本身不存在(非业务资源不存在) | | 405 | 方法不允许 | 请求方法不被支持 | | 500 | 服务不可用 | 未捕获的服务端异常导致请求无法处理 | **禁止使用 HTTP 状态码表达业务语义**(如 401 表示未登录、403 表示无权限、409 表示冲突等),这些业务状态统一通过 `code` 字段返回。 ## 业务码规范 ``` 编码规则:5位分段编码 {模块码(2位)}{错误序号(3位)} 成功码:0 模块码分配: - 10:通用/公共 - 20:认证授权 - 30:用户 - 40:订单 - 50:商品 - 60:支付 - 70:消息 - 90:系统 示例: - 0:成功 - 10001:通用-参数校验失败 - 10002:通用-请求过于频繁 - 20001:认证-Token过期 - 20002:认证-Token无效 - 20003:认证-未登录 - 30001:用户-用户不存在 - 30002:用户-用户已存在 - 30003:用户-密码错误 - 40001:订单-订单不存在 - 40002:订单-库存不足 - 50001:商品-商品不存在 - 50002:商品-商品已下架 - 60001:支付-余额不足 - 60002:支付-支付超时 - 90001:系统-服务内部错误 - 90002:系统-外部服务调用失败 - 90003:系统-数据库操作失败 ``` ## 安全规范 ``` API 安全清单: □ 所有接口需要认证(公开接口除外) □ 敏感操作需要二次验证 □ 使用 HTTPS □ Token 使用 Bearer 方式 □ 实现限流(IP/用户级别) □ 参数校验在入口层完成 □ 响应不暴露内部错误堆栈 □ 响应不暴露数据库 ID(使用业务 ID) □ 敏感字段脱敏(手机号、身份证) □ 支持跨域配置(CORS) ``` ## 版本管理 ``` 版本策略: - URL 路径版本:/api/v1/、/api/v2/ - 新版本只在新路径添加,旧版本保持兼容 - 废弃版本提前通知,至少保留 6 个月 - 同一版本内变更必须向后兼容 兼容性规则: ✅ 允许:添加新字段(可选) ✅ 允许:添加新接口 ✅ 允许:添加新枚举值 ❌ 禁止:删除字段 ❌ 禁止:修改字段类型 ❌ 禁止:修改字段语义 ❌ 禁止:修改 URL 路径 ``` ## API 文档规范 - 错误响应必须文档化:每个接口列出可能返回的业务错误码(code)及调用方处理建议 - 文档中的请求/响应字段名、类型、示例必须与实际实现一致 - 文档结构与模板(接口信息、参数表、示例、错误码表等)遵循 tech-doc 技能的"API 接口文档"模板 ## AI 生成 API 常见问题 | 问题 | 风险 | 正确做法 | |------|------|---------| | 缺少版本号 | 无法演进 | URL 包含 `/v1/` | | 响应格式不统一 | 调用方处理复杂 | 统一包装 code/message/data,成功码固定为 0 | | 缺少分页 | 大数据量崩溃 | 列表接口必须支持分页 | | 缺少错误码 | 无法区分错误类型 | 定义5位分段业务错误码 | | 用HTTP状态码表达业务 | 前端处理复杂 | 绝大部分返回 HTTP 200,通过 code 区分业务结果 | | 忽略幂等 | 重复提交 | POST 创建支持幂等 token | | 缺少参数校验 | 非法数据入库 | 入口层统一校验 | | 响应暴露内部信息 | 安全风险 | 统一错误响应格式 |
View on GitHub