我一直在阅读有关 ReST API 的版本控制策略,但它们似乎都没有解决您如何管理底层代码库的问题。
假设我们正在对 API 进行一系列重大更改 - 例如,更改我们的 Customer 资源,使其返回单独的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 的组织如何解决这个问题。