用途
本指南用于指导 API 版本化策略的落地,覆盖 REST API、GraphQL 与 gRPC 服务,内容涉及版本化方案、弃用策略、向后兼容技术与迁移规划。
适用场景包括:
- 从设计之初就为新 API 引入版本化
- 向现有 API 添加破坏性变更
- 弃用旧 API 版本
- 规划 API 迁移
- 确保向后兼容
- 同时管理多个 API 版本
- 为不同版本编写 API 文档
- 实现 API 版本路由
主要能力
指南在 references/ 目录下提供详细实现参考,覆盖以下主题:
- 版本化方法(Versioning Approaches)
- 向后兼容模式(Backward Compatibility Patterns)
- 弃用策略(Deprecation Strategy)
- 迁移指南示例(Migration Guide Example)
- 响应结构(Response Structure)
- 日期格式与错误格式(Date Format, Error Format)
- JavaScript/TypeScript、Python
- GraphQL 版本化(GraphQL Versioning)
- gRPC 版本化(gRPC Versioning)
- 版本检测与路由(Version Detection & Routing)
- 多版本测试(Testing Multiple Versions)
此外还包含三种模式:版本无关核心(Version-Agnostic Core)、基于功能开关的渐进式发布(Feature Flags for Gradual Rollout)、API 版本指标(API Version Metrics)。
使用方式
快速上手提供一个基于 Express 的最小可用示例:使用 app.get 分别定义 /api/v1/users 与 /api/v2/users 路由返回不同字段,并通过 /api/:version/users/:id 这类共享逻辑配合按版本的转换处理响应。完整实现需参见参考指南。
代码示例(express-router.ts):
import express from "express";
const app = express();
// Version 1
app.get("/api/v1/users", (req, res) => {
res.json({
users: [{ id: 1, name: "John Doe" }],
});
});
// Version 2 - Added email field
app.get("/api/v2/users", (req, res) => {
res.json({
users: [{ id: 1, name: "John Doe", email: "john@example.com" }],
});
});
// Shared logic with version-specific transformations
app.get("/api/:version/users/:id", async (req, res) => {
const user = await userService.findById(req.params.id);
if (req.params.version === "v1") {
res.json({ id: user.id, name: user.name });
// ... (see reference guides for full implementation)
最佳实践
应做(DO):
- 第一天就做版本化(即使是 v1)
- 记录破坏性与非破坏性变更
- 提供带代码示例的清晰迁移指南
- 采用语义化版本原则
- 给予 6-12 个月弃用通知期
- 监控已弃用 API 的使用情况
- 向 API 消费者发送弃用警告
- 同时至少支持 2 个版本
- 使用适配器/转换器承载版本逻辑
- 测试所有受支持的版本
- 记录正在使用的 API 版本
- 尽可能提供迁移工具
- 保持版本化方案的一致性
不应做(DON'T):
- 不做版本化就更改 API 行为
- 未通知即移除版本
- 支持过多版本(>3)
- 在同一个 API 中使用不同的版本化策略
- 不递增版本就破坏 API
- 忘记更新文档
- 过快弃用(<6 个月)
- 忽视 API 消费者的反馈
- 把每次改动都当作新版本
- 不一致地使用版本号
限制
本资料未提供具体的收费方式、价格、支持平台与运行环境要求等信息,暂未提供。