【发布时间】:2015-07-04 11:45:02
【问题描述】:
我一直在阅读有关 ReST API 的版本控制策略,但似乎没有一个解决的是您如何管理底层代码库。
假设我们正在对 API 进行一系列重大更改 - 例如,更改我们的客户资源,使其返回单独的 forename 和 surname 字段,而不是单个 name 字段。 (对于这个例子,我将使用 URL 版本控制解决方案,因为它很容易理解所涉及的概念,但这个问题同样适用于内容协商或自定义 HTTP 标头)
我们现在在http://api.mycompany.com/v1/customers/{id} 有一个端点,在http://api.mycompany.com/v2/customers/{id} 有另一个不兼容的端点。我们仍在为 v1 API 发布错误修复和安全更新,但新功能开发现在都集中在 v2 上。我们如何编写、测试和部署对 API 服务器的更改?我至少可以看到两种解决方案:
为 v1 代码库使用源代码控制分支/标记。 v1 和 v2 是独立开发和部署的,在必要时使用修订控制合并来将相同的错误修复应用于两个版本 - 类似于在开发主要新版本同时仍支持以前版本时管理本机应用程序的代码库的方式。
让代码库本身了解 API 版本,因此您最终会得到一个包含 v1 客户表示和 v2 客户表示的单一代码库。将版本控制视为解决方案架构的一部分,而不是部署问题 - 可能使用命名空间和路由的某种组合来确保请求由正确的版本处理。
分支模型的明显优势在于删除旧的 API 版本很简单 - 只需停止部署适当的分支/标签 - 但如果您运行多个版本,您最终可能会得到一个非常复杂的分支结构和部署管道。 “统一代码库”模型避免了这个问题,但是(我认为?)当不再需要时,从代码库中删除已弃用的资源和端点会变得更加困难。我知道这可能是主观的,因为不可能有一个简单的正确答案,但我很想了解跨多个版本维护复杂 API 的组织如何解决这个问题。
【问题讨论】:
-
感谢您提出这个问题!我不能相信更多的人没有回答这个问题!我厌倦了每个人都对版本如何进入系统有意见,但似乎没有人解决将版本分配到适当代码的真正难题。到目前为止,对于这个看似常见的问题,至少应该有一系列公认的“模式”或“解决方案”。关于“API 版本控制”的 SO 存在大量问题。决定如何接受版本是 FRIKKIN 简单(相对)!一旦进入代码库,就很难处理它!
标签: rest versioning api-versioning