上线前的 API 契约检查清单

很多 API 问题不是代码写错,而是契约没有提前讲清。

快速结论

检查字段语义、错误码、兼容窗口、重试行为、幂等键、监控字段和弃用说明。缺其中任意一项,都可能在联调阶段变成反复返工。

你应该先看什么

可直接复用的示例

发布前检查
- 新字段是否可选
- 删除字段是否有弃用窗口
- 429/5xx 是否提供重试指引
- 幂等写接口是否声明 idempotency key

破坏性变更分类

并非所有契约变更都同等危险。有些可以安全发布而无需版本边界;有些会立即破坏消费者。区分这两者对发布计划、消费者通知和回滚策略至关重要。

"静默破坏"类最危险,因为它通过了所有现有测试。将日期时间字段从 UTC 改为本地时区在内部看似微小,却会破坏所有存储或展示该值的消费者。此类变更需要协调发布并通知消费者,而不仅仅是版本号升级。

消费者驱动的契约测试

生产者侧的契约测试验证你的 API 是否符合自己的 OpenAPI 规格——这是必要条件,但不充分。消费者驱动的契约测试更进一步:每个消费者发布它实际使用的 API 内容——读取的字段、处理的状态码、解析的错误结构——生产者在每次构建中运行该消费者的期望集。

消费者驱动测试对内部微服务 API 尤为重要——"所有消费者都是我们团队的人"这一理由常被用来跳过契约形式化。内部团队变动快,以对其他团队不可见的方式改变行为,直到在测试环境或生产中出现故障。

版本化决策清单

版本化 API 端点的决定通常是被动的——在破坏性变更已经发布之后才作出。这份清单让版本化决策在变更编写前明确,而非在消费者事故发生后。

# 版本化决策门控

变更是否仅为累加型?
  是 → 无需版本号变更;在变更日志中记录新字段

变更是否修改了已有字段行为?
  是 → 需要版本边界;弃用旧行为并附迁移时间表

所有消费者是否需要同时迁移?
  是 → 协调发布并提供迁移指南;不立即移除旧行为
  否 → 在迁移窗口期并行支持新旧行为

旧行为是否会被移除?
  是 → 设置移除日期;通知消费者;向旧端点添加弃用响应头
  否 → 无限期维护;文档化支持承诺

新版本发布后是否可回滚?
  是 → 记录回滚流程和数据兼容性影响
  否 → 视为不可逆迁移;发布前需明确审批

上线后如何确认契约没有漂移

API 契约不是发布前签一次字就结束。上线后至少要观察一个真实流量窗口,确认响应字段、错误码、延迟、重试行为和消费者日志都与规格一致。尤其是新增字段、枚举值和分页行为,最容易在生产数据出现后暴露未写清的语义。

如果上线后发现契约和实际行为不同,不要只修代码或只修文档。应先判断哪一方是团队认可的目标行为,再同步更新测试、示例和发布说明。

对于跨团队接口,最好把这个复查安排在发布后一个固定窗口内完成,例如 24 小时或一个完整业务日,而不是等消费者主动报错。

复查结果应作为下一次契约评审的输入。

落地建议

在下一次 API 发布前,把这份清单过一遍。重点关注"删字段有没有弃用窗口"和"幂等接口有没有声明 key"——这两项是最常在联调时才被发现的缺口。

更新日期:2026-03-10

上线前的最后一轮契约核对

发布前建议让接口生产方和至少一个真实调用方一起过一遍清单。重点看新增字段是否真正向后兼容,错误码是否足够稳定,重试是否安全,分页或排序是否可预测,以及监控能否按端点、状态码、错误码和 traceId 定位问题。

如果评审中发现“这个调用方不会这样用”,请把这个判断写回规格。隐含的调用假设最容易在下一个客户端或脚本任务上线时变成破坏性变更。

契约上线后的观察窗口

API 契约上线后,建议至少保留一个明确观察窗口,重点看错误码分布、重试次数、超时、调用方版本和异常 traceId。契约是否可靠,不只取决于发布当天是否返回 200,而取决于调用方能否按文档处理失败。

如果观察期内出现大量未知错误、重复请求或字段误用,应把结果反馈到契约清单,补充示例、错误说明或兼容策略。

编辑说明

本指南涵盖 上线前的 API 契约检查清单,面向 Spec-First 工程团队。示例为说明性场景,非生产代码。