返回顶部
a

api-versioningAPI版本管理

API versioning strategies — URL path, header, query param, content negotiation — with breaking change classification, deprecation timelines, migration patterns, and multi-version support. Use when evolving APIs, planning breaking changes, or managing version lifecycles.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.0
安全检测
已通过
741
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

api-versioning

API 版本控制模式

自信地演进你的 API。正确地进行版本控制、优雅地弃用、安全地迁移——而不会破坏现有消费者。

版本控制策略

选择一种策略,并在整个 API 表面一致地应用它。

策略格式可见性可缓存性最佳适用场景
URL 路径/api/v1/users极佳公共 API、第三方集成
查询参数
/api/users?v=1 | 中 | 中等 | 简单 API、原型开发 |
| 请求头 | Accept-Version: v1 | 低 | 良好 | 内部 API、协调的消费者 |
| 内容协商 | Accept: application/vnd.api.v1+json | 低 | 良好 | 企业级、严格的 REST 合规 |


URL 路径版本控制

最常见的策略。版本位于 URL 中,使其立即可见。

python
from fastapi import FastAPI, APIRouter

v1 = APIRouter(prefix=/api/v1)
v2 = APIRouter(prefix=/api/v2)

@v1.get(/users)
async def listusersv1():
return {users: [...]}

@v2.get(/users)
async def listusersv2():
return {data: {users: [...]}, meta: {...}}

app = FastAPI()
app.include_router(v1)
app.include_router(v2)

规则:

  • - 始终添加前缀:/api/v1/... 而非 /v1/api/...
  • 仅主版本号:/api/v1/,绝不用 /api/v1.2/ 或 /api/v1.2.3/
  • 每个端点都必须有版本号——不要混用有版本和无版本的路径

请求头版本控制

通过请求头指定版本,保持 URL 整洁。

javascript
function versionRouter(req, res, next) {
const version = req.headers[accept-version] || v2; // 默认使用最新版本
req.apiVersion = version;
next();
}

app.get(/api/users, versionRouter, (req, res) => {
if (req.apiVersion === v1) return res.json({ users: [...] });
if (req.apiVersion === v2) return res.json({ data: { users: [...] }, meta: {} });
return res.status(400).json({ error: 不支持的版本: ${req.apiVersion} });
});

当未发送版本请求头时,始终定义回退行为——默认使用最新的稳定版本或返回 400 Bad Request。

API 的语义化版本控制

SemVer 组件API 含义需要采取的行动
主版本号 (v1 → v2)破坏性变更——删除字段、重命名端点、更改认证客户端必须迁移
次版本号 (v1.1 → v1.2)
新增、向后兼容——新的可选字段、新端点 | 无需客户端更改 | | 修订号 (v1.1.0 → v1.1.1) | 错误修复,行为无变化 | 无需客户端更改 |

只有主版本号出现在 URL 路径中。通过变更日志传达次版本号和修订号。



破坏性变更与非破坏性变更

破坏性变更——需要新版本

变更为何会破坏
删除响应字段读取该字段的客户端得到 undefined
重命名字段
从客户端角度来看等同于删除 | | 更改字段类型 | id: 123 → id: 123 会破坏类型化客户端 | | 删除端点 | 调用它的客户端得到 404 | | 将可选参数变为必填 | 缺少该参数的现有请求开始失败 | | 更改 URL 结构 | 已收藏/硬编码的 URL 失效 | | 更改错误响应格式 | 客户端错误处理逻辑失效 | | 更改认证机制 | 现有凭据停止工作 |

非破坏性变更——同一版本下安全

变更为何安全
添加新的可选响应字段客户端忽略未知字段
添加新端点
不影响现有端点 | | 添加新的可选查询/请求体参数 | 现有请求无需它即可工作 | | 添加新的枚举值 | 如果客户端优雅地处理未知值则安全 | | 放宽验证约束 | 先前有效的请求仍然有效 | | 提升性能 | 相同接口,更快响应 |

弃用策略

在没有警告的情况下切勿删除版本。遵循以下时间线:

阶段 1:宣布
• 响应中的 Sunset 请求头 • 变更日志条目
• 发送邮件/Webhook 给消费者 • 文档标记为已弃用

阶段 2:日落期
• v1 仍然工作但发出警告 • 监控 v1 流量
• 联系剩余消费者 • 提供迁移支持

阶段 3:移除
• v1 返回 410 Gone
• 响应体包含迁移指南 URL
• 将文档重定向到 v2

最短弃用期: 公共 API:12 个月 · 合作伙伴 API:6 个月 · 内部 API:1–3 个月

Sunset HTTP 请求头 (RFC 8594)

在来自已弃用版本的每个响应中包含:

HTTP/1.1 200 OK
Sunset: Sat, 01 Mar 2025 00:00:00 GMT
Deprecation: true
Link: ; rel=sunset
X-API-Warn: v1 已弃用。请在 2025-03-01 前迁移到 v2。

已退役版本响应

当超过日落期后,返回 410 Gone:

json
{
error: VersionRetired,
message: API v1 已于 2025-03-01 退役。,
migration_guide: https://api.example.com/docs/migrate-v1-v2,
current_version: v2
}



迁移模式

适配器模式

共享业务逻辑,特定版本的序列化:

python
class UserService:
async def getuser(self, userid: str) -> User:
return await self.repo.find(user_id)

def to_v1(user: User) -> dict:
return {id: user.id, name: user.full_name, email: user.email}

def to_v2(user: User) -> dict:
return {
id: user.id,
name: {first: user.firstname, last: user.lastname},
emails: [{address: e, primary: i == 0} for i, e in enumerate(user.emails)],
createdat: user.createdat.isoformat(),
}

外观模式

单一入口点委托给正确的版本化处理器:

python
async def getuser(userid: str, version: int):
user = await userservice.getuser(user_id)
serializers = {1: tov1, 2: tov2}
serialize = serializers.get(version)
if not serialize:
raise UnsupportedVersionError(version)
return serialize(user)

版本化控制器

每个版本有独立的控制器文件,共享服务层:

api/
v1/
users.py # v1 请求/响应结构
orders.py
v2/
users.py # v2 请求/响应结构
orders.py
services/
user_service.py # 与版本无关的业务逻辑
order_service.py

API 网关路由

在基础设施层路由版本:

yaml
routes:
- match: /api/v1/*
upstream: api-v1-service:8080
- match: /api/v2/*
upstream: api-v2-service:8080



多版本支持

架构:

请求 → API 网关 → 版本路由器 → v1 处理器 → 共享服务层 → 数据库
→ v2 处理器 ↗

原则:

  1. 1. 业务逻辑与版本无关。 服务、存储库和领域模型是共享的。
  2. 序列化是特定于版本的。 每个版本有自己的请求验证器和响应序列化器。
  3. 转换是显式的。 v1tov2 转换器记录了每个字段的映射。
  4. 测试覆盖所有活跃版本。 每个受支持的版本都有自己的集成测试套件。

最大并发版本数: 2–3 个活跃版本(当前版本 + 1–2 个已弃用版本)。超过 3 个会产生不可持续的维护负担。



客户端沟通

变更日志

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 api-versioning-1776323662 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 api-versioning-1776323662 技能

通过命令行安装

skillhub install api-versioning-1776323662

下载

⬇ 下载 api-versioning v1.0.0(免费)

文件大小: 5.64 KB | 发布时间: 2026-4-17 16:07

v1.0.0 最新 2026-4-17 16:07
Initial release with comprehensive API versioning guidance.

- Describes and compares API versioning strategies: URL path, header, query param, and content negotiation.
- Explains breaking vs. non-breaking changes and how to classify them.
- Details deprecation timelines, using Sunset headers, and the recommended process for removing versions.
- Provides migration and multi-version support patterns, including adapter/facade strategies and gateway routing.
- Outlines best practices for API changelogs, migration guides, and communicating with clients.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部