契约路径

API 契约主题 Hub

面向 API 契约写作的实用路径,覆盖兼容性、重试、错误码、版本、Webhook 行为和发布安全。

最近更新:2026-05-06

从这里开始

定义行为,不只定义结构

状态码、重试建议、幂等、字段语义和错误 payload 都应该在实现前写进契约。

查看错误模式

审查 schema diff

每个变化都要分类为安全、风险或破坏性,并在发布前写明消费者动作。

审查 schema diff

提前规划废弃

用量查询、迁移窗口、Sunset header 和客户通知应该是契约的一部分。

打开废弃指南

决策矩阵

位置写法评审意义
新增字段通常安全,但客户端拒绝未知字段时有风险补契约说明和消费者测试
枚举扩展对生成客户端经常是破坏性变更需要兼容性评审和发布说明
错误结构变化客户端解析稳定 code 时会破坏版本化错误分类并保留旧字段
Webhook 重试变化可能产生重复副作用需要幂等 key 和重放测试

可复制片段

# API 契约评审块

Endpoint:
- Method / path:
- 消费方:

兼容性评审:
- 增量变化:
- 风险变化:
- 破坏性变化:

运行时行为:
- 重试策略:
- 幂等 key:
- 错误分类:

发布门禁:
- 消费者测试:
- 迁移说明:
- 回滚方案:

API 发布前如何使用这个 Hub

只要 API 变化可能改变消费者假设,就应该使用这个 Hub。结构变化只是风险的一部分,消费者还会依赖时序、重试行为、枚举含义、分页顺序、错误码、认证规则和没有写在文档里的副作用。契约评审要在 schema 发布前把这些假设摊开。

从 diff 开始,但不要止步于 diff。每个字段、状态码、事件和重试规则都要分类为安全、风险或破坏性变化。然后写清消费者需要采取什么动作。如果动作是“无需处理”,就说明为什么旧客户端仍然正确。说不清楚,就还不能发布。

强的 API 规格会把发布说明和运行时监控接起来。废弃说明没有用量查询是不完整的;Webhook 变化没有重放和幂等测试是不完整的;版本策略没有迁移窗口也是不完整的。消费者路径和提供方路径一样清楚,契约才算完成。

评审量表

检查项通过标准
兼容性每个变化都分类为安全、风险或破坏性。
消费者动作内部和外部消费者知道是否需要改代码。
运行语义重试、幂等、分页和错误结构都写明。
发布沟通迁移说明和废弃窗口在发布前准备好。
可观测性发布后能通过日志和指标识别不匹配客户端。

常见失败模式

  • schema diff 通过,但语义行为悄悄变了。
  • 枚举扩展被当成安全变化,生成客户端却可能拒绝未知值。
  • 错误 payload 改了,却没有保留稳定 code。
  • 消费者在放量开始后才收到迁移说明。

交接说明

交接产物应包含契约 diff、消费者列表、迁移说明、测试证据和回滚决策。它应该放在 API spec 附近,而不是只躺在发布工单里。

真实契约评审示例

一个很小的枚举变化就足够测试契约评审质量。提供方可能认为新增 status=archived 是安全的,因为旧客户端可以忽略。但生成客户端、switch 语句、分析任务和 Webhook 消费者未必能忽略。规格要写明已知消费者、未知枚举值处理方式,以及旧 SDK 是否需要在放量前发补丁。

发布责任人要附上按客户端版本统计当前流量的查询、schema diff 和回滚选择。如果回滚意味着用 feature flag 隐藏新枚举,就写清楚。如果回滚意味着回退契约并重放事件,也要写清楚。关键是不能等消费者开始失败后再猜。

真实场景拆解:Enum 扩展

新增 enum 在 OpenAPI 里看起来很小,但生成客户端经常把 enum 当成封闭集合。它应该被当成调用方行为评审,而不只是 schema 编辑。

评审项问题证据
调用方清单哪些客户端解析 refund_status?Web、移动端、合作方 webhook、分析任务
生成客户端风险是否有 SDK 把 enum 视为封闭?用包含 pending_review 的 fixture 编译旧 SDK
fallback 行为未知值应该展示什么?未知状态映射到 review_required UI 状态
迁移说明发布前谁必须行动?移动端团队在公开放量前更新 switch

快速审核清单

把这个 Hub 用到真实团队之前,先做一个短审核。第一,读者离开页面时是否能复制一个产物到自己的流程里。第二,关联文章是否分别回答不同问题,而不是重复同一个定义。第三,页面是否点出了生产环境里真的会造成损失的失败模式,而不只是停留在计划阶段。

有用的 Hub 更像工作台。读者应该能打开页面,选择路径,复制片段,并知道评审前要附什么证据。如果页面只是解释主题,它只是另一篇文章;如果它能帮助读者决定下一步怎么做,它才是资源。

发布前复核问题

最后再问三个问题:这页是否让读者知道第一步该做什么;是否给了可以直接复制的文本;是否说明了什么情况下应该暂停而不是继续推进。只要其中一个答案是否定的,就不要把它当作完成。主题页的价值不是把文章重新包装一遍,而是把分散内容整理成一条能执行的路线。

这也是给审核员看的质量信号:页面有明确主题,有原创组织方式,有表格、流程、示例和行动项,并且能把读者带到下一步资源。它不是为了凑字数存在,而是帮助用户更快判断自己需要哪类规格、哪类证据和哪类评审。

核心与进阶 API 文章

从 OpenAPI 到 CI 的契约测试计划

把 schema 和行为预期接进 CI,减少发布后的契约漂移。

阅读文章

向后兼容的 API 变更规格写法

在上线前区分安全、风险和破坏性变更。

阅读文章

AI 生成客户端下的 API 变更治理

当客户端可能来自旧文档或 AI 输出时,管理 API 变更和迁移路径。

阅读文章

AI 集成场景下的 API 错误分类体系

设计稳定 error code、retry category 和机器可读失败细节。

阅读文章

为 Agentic 客户端设计 API 规格

让智能体客户端不会乱造 ID、跳过 dry-run 或破坏性重试。

阅读文章

契约优先的 SDK 生成与人工评审流程

把生成层和人工设计层分开评审,避免 SDK 只“能用”但不好用。

阅读文章

事件驱动系统的规格模式

写清事件版本、消费者所有权、重放安全和编排边界。

阅读文章

移动端推送偏好规格

把推送偏好当作跨设备、权限、静音时段和同意状态的契约。

阅读文章

常见问题

API Spec 和 OpenAPI 有什么区别?

OpenAPI 描述结构。规格还要写清行为:兼容性、重试语义、失败处理、放量预期和消费者通知。

小变化什么时候也要做契约评审?

只要影响字段、错误、幂等、认证、限流、版本,或任何消费者可能依赖的行为,就值得评审。

需要直接落地时,先打开模板,再回到这页补齐评审和证据。