关于 api-design
api-design 帮助团队将集成构想和服务边界转化为可供实现的 API 契约。它引导 REST 或 GraphQL 等设计选择,并明确操作、错误、兼容性及待解决问题,供后续团队使用。
主要功能
- 01说明理由并选择 API 风格
- 02定义资源、操作与边界
- 03规定请求和响应行为
- 04明确认证、错误及兼容性预期
- 05生成 OpenAPI 或 GraphQL 契约
适用场景
- 01在实现前设计新的服务 API
- 02评审 API 变更对客户端的兼容性
- 03为 REST 服务准备 OpenAPI 大纲
- 04为仪表盘起草 GraphQL 模式
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ akillness/ jeo-skills --skill api-design安装后在 Claude Code 中输入/api-design确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
SKILL.toonevals/evals.jsonreferences/boundary-guide.mdcontract-review-checklist.md详细介绍
API 设计
使用此技能,将模糊的集成构想、后端功能或服务边界转化为稳定的 API 契约,供其他技能基于此开展工作。
目标不是生成精美文档,而是:
- 为问题选择合适的 API 风格
- 定义资源、操作、输入、输出和失败语义
- 明确兼容性和版本控制决策
- 生成实现、测试和文档可共用的契约工件
- 在团队固化错误的接口之前,揭示各种权衡
处理不寻常或高风险的 API 工作前,请先阅读 references/contract-review-checklist.md 和 references/boundary-guide.md。
如果用户主要需要:
- 参考文档、教程、示例丰富的指南或文档门户设置 → 使用
api-documentation - 身份验证实现或令牌/会话配置 → 使用
authentication-setup - 契约/集成测试策略 → 使用
backend-testing - 架构/索引/存储设计 → 使用
database-schema-design
适用场景
- 设计新的 REST API、GraphQL 架构或内部服务契约
- 重构现有 API,同时避免不必要地破坏客户端
- 审查命名、资源边界、状态码、分页、筛选、幂等性或错误模型
- 在开始实现前生成 OpenAPI 或 GraphQL SDL 契约
- 评估版本控制和向后兼容性决策
- 判断 API 应继续使用 REST、迁移到 GraphQL,还是有意同时提供两种层
- 为后端、前端、QA 或合作伙伴团队准备可直接用于实现的契约包
不适用场景
- 主要任务是构建交互式文档、SDK 文档、入门指南或示例门户 → 使用
api-documentation - 主要任务是编写服务端代码、身份验证中间件、解析器或持久化逻辑
- 主要任务是数据库规范化、索引或存储模型优化 → 使用
database-schema-design - 请求主要涉及测试规划或契约测试覆盖 → 使用
backend-testing - 目前信息还不够明确,无法准确确定 API 形态;此时应列出待解决的问题并规划设计探索,而不是假装已经确定
说明
步骤 1:明确契约问题
在设计端点之前,先记录设计输入。
记录:
- 调用 API 的用户或系统
- 业务操作或要完成的任务
- 领域实体和所有权边界
- 影响兼容性的现有客户端或迁移
- 敏感性/安全要求
- 预期的规模模式:读取、写入、扇出、分页、突发流量
- 所需的工件格式:OpenAPI、GraphQL SDL、端点表或设计备忘录
如果请求信息不充分,请在设计包中明确说明缺失的假设。
步骤 2:审慎选择接口风格
不要因为习惯而默认采用某种风格。
优先选择 REST 的情况
- 工作流以资源为中心
- 缓存、可预测的 URL 或简单的类 CRUD 操作很重要
- 外部客户端需要稳定、规范的 HTTP 语义
- 需要使用 OpenAPI 工具、模拟工具和广泛兼容的生态
优先选择 GraphQL 的情况
- 客户端需要灵活选择字段或组合遍历图数据
- 前端团队需要减少多个页面中的过度获取/获取不足
- 相比固定的端点列表,架构更适合作为共享契约
- 已有或预计会使用架构注册表/破坏性变更检查
仅在以下情况下采用混合方案
- 各自职责明确不同
- 团队能够说明由谁使用哪一层,以及原因
- 能够避免所有权重复和接口漂移
说明选择该风格的原因。“因为大家都在用”并不足够。
步骤 3:对资源、操作和边界建模
对于 REST:
- 定义顶层资源及其所有权边界
- 使用名词,而非动词形式的端点;只有在操作端点确实更清晰时才使用
- 除非嵌套资源具有明确的父子关系,否则保持 URL 结构扁平
- 分别列出标准操作和领域特定操作
对于 GraphQL:
- 定义核心类型、关系、查询和变更
- 避免设计一个包揽所有操作的巨型变更接口
- 说明分页、筛选和字段级授权的适用范围
- 指出可能频繁变更的架构区域
对于任一种风格:
- 标明同步与异步行为
- 指明写入操作是否幂等
- 如有相关情况,说明最终一致性或长时间运行的任务行为
步骤 4:定义请求/响应契约
设计契约,而不只是理想情况下的流程。
包括:
- 请求结构和必填字段
- 成功时的响应结构
- 分页或游标规则
- 筛选/排序语义
- 可空性和默认值
- 字段命名约定
- 时间戳、ID 和枚举行为
- 部分更新行为
如果 API 同时支持机器对机器和前端客户端,请说明响应结构或扩展模式有哪些不同。
步骤 5:设计身份验证、错误和兼容性规则
记录客户端所依赖的运行语义。
定义:
- 契约层面的身份验证模型预期(例如:必须提供 bearer token、角色检查、租户范围限定)
- 常见状态码/错误类别
- 机器可读的错误代码
- 重试/幂等性预期
- 弃用和停止服务行为
- 兼容性承诺:可安全增补、存在破坏性变更、受版本控制,或需要迁移
此处不要完整实现身份验证。只需定义契约;必要时将详细配置交接给 authentication-setup。
步骤 6:生成契约文档
选择足以支持后续工作的最轻量级文档。
推荐格式:
- OpenAPI 大纲,适用于 REST 契约和注重评审的环境
- GraphQL SDL 草案,适用于以架构为先的 GraphQL 工作
- 端点/操作表,适用于早期架构讨论
- 设计备忘录 + 风险清单,适用于仍在讨论合适方案的情况
最低限度的契约材料包:
- 选择的风格及原因
- 目标受众/使用方
- 实体或类型映射
- 操作以及请求/响应摘要
- 身份验证/错误/版本控制说明
- 未决问题/风险
- 后续交接事项
步骤 7:检查破坏性变更和交接质量
定稿前,请检查:
- 是否会导致现有客户端出问题?
- 命名和语义是否一致?
- 分页/筛选规则是否切实可实现?
- 错误状态和身份验证失败是否描述得足够明确,便于前端/QA/文档工作?
- 是否不小心将契约设计与教程编写或服务端实现混在了一起?
明确安排后续步骤:
api-documentation:编写公开文档、教程、示例并配置文档门户backend-testing:规划契约测试和集成测试authentication-setup:实现具体的身份验证database-schema-design:存储模型需要单独设计时使用
输出格式
## API Design Packet: [Name]
### Contract framing
- Style: [REST | GraphQL | mixed-with-justification]
- Consumers: [internal services / frontend app / partners / public developers]
- Primary job: [what the API enables]
### Resource or type model
- [resource/type]: [purpose]
- [resource/type]: [purpose]
### Operations
| Operation | Purpose | Input summary | Output summary | Notes |
|-----------|---------|---------------|----------------|-------|
| [GET/POST/query/mutation] | ... | ... | ... | ... |
### Contract rules
- Auth model: [...]
- Error model: [...]
- Pagination/filtering: [...]
- Versioning / compatibility: [...]
### Risks / open questions
- [...]
### Handoffs
- Documentation: [does `api-documentation` need to turn this into published docs?]
- Testing: [does `backend-testing` need contract/integration coverage?]
- Auth / data model: [adjacent handoffs]
示例
示例 1:面向合作伙伴集成的公开 REST 契约
输入:“为电商供应商设计一个面向合作伙伴的订单状态 API。我们需要稳定的轮询机制、后续可回退到 Webhook,并谨慎处理版本控制。”
良好的响应结构:
- 选择 REST,因为外部合作伙伴需要可预测的 HTTP 语义
- 清晰定义
orders和order-events - 说明状态转换、分页、按更新时间筛选以及版本控制/弃用规则
- 包含机器可读的错误代码,以及对幂等 Webhook 注册操作的预期
- 将合作伙伴文档和示例交接给
api-documentation
示例 2:面向仪表板客户端的 GraphQL 架构
输入:“我们需要一个包含项目、部署、事件和警报的仪表板 API。界面有许多视图,而且 REST 会持续过度获取数据。”
良好响应形式:
- 说明为何选择 GraphQL 来支持灵活的客户端读取
- 定义核心类型以及查询/变更的边界
- 指出分页以及字段/查询级别的授权
- 标记可能的架构热点和需要审核的破坏性变更
- 移交给
backend-testing进行契约检查,并移交给api-documentation编写示例查询
最佳实践
- 将 API 契约视为产品边界,而不只是代码上的便利。
- 将设计决策与文档发布分开。
- 记录假设和未解决的问题,不要假装确定无疑。
- 优先采用增量演进和明确弃用,避免意外引入破坏性变更。
- 选择 REST 还是 GraphQL 时,清楚呈现选择依据。
- 使用能让下游团队采取行动的最小产物。
- 有意移交给相邻技能,而不是让本技能变得臃肿。