API 版本控制和存储数据

API Versioning and Storing Data

公开不同的 API 版本时,您如何处理可能具有不同结构的数据的存储和检索?

假设我们有两个 API 版本; V1 和 V2。 V1 和 V2 在“https://api.com/message”处都有一个 POST 端点,它将根据传递的数据在数据库中创建一条消息,例如:

{
    DOB: '2014-12-01'
}

在 V1 中,所需的数据与 V2 不同,因为在 V2 中,我们决定将 DOB 从格式为 'YYYY-MM-DD' 的字符串更改为整数时间戳,例如1284723728323

在这种情况下,当我们从使用 V2 API 的调用中保存数据时,DOB 字段将是一个整数,但是当从对 V1 的调用中保存时,它将是一个格式非常不同的字符串。

随着 API 的每次迭代,我们可能会修改基础数据的许多方面。调用较旧的 API 版本将导致存储的数据对于 API.

的其他版本不正确

是否有一种优雅的方式来处理需要不同格式/结构的数据的不同 API 版本?

API 版本接受什么表示应该与数据在后端的存储方式无关。我会这样做:

  • API 的 V1 接受并生成 YYYY-MM-DD 字符串作为日期。
  • API 的 V2 接受并生成 1284723728323 整数作为日期。
  • 两个版本的API将它们的格式映射到通用存储类型
  • 如果必须更改公共存储类型(例如,从字符串到 int),将执行内容迁移以及任何必要的映射代码更新。

我首先要做的是确保每个面向网络的 API 对应于真实编程语言中的实际 interface(例如,Java)。

因此,问题现在变成了编程语言的问题 API 版本控制,并且没有考虑特定于 Web 服务的问题。

然后,我会让接口名称包含版本号,如 MyWebServiceInterfaceV1。

一旦界面的某个版本对外发布,("it is free in the wild",可以这么说,)包含界面的源代码文件夹将锁定源代码存储库,以便任何人都无法再次修改它。然后复制界面并增加其版本号,从那一刻起,所有新工作都在新版本上完成。

所以,我们现在正在开发 MyWebServiceInterfaceV2。

对于您引入的每个新版本的接口,您还编写了一个实现旧接口并映射到新接口的转换器 class,并且您一直维护 class 直到新接口出现界面也被锁定了。

因此,从 V1 到 V2 的转换器 class 必须能够将字符串日期转换为整数日期,并且可能还可以相反:将整数日期转换为字符串日期。这里要意识到的重要一点是所有的转换都应该是可能的;如果转换看起来不可能,那么这意味着您正计划在一个方向上进行更改,这将使您的系统无法向后兼容旧版本。只要您在所有新设计中牢记向后兼容性,所有必要的转换都应该是可能的。

如果你有 N 个版本,你可以实现 (N-squared)/2 个不同的转换器,以便能够直接从任何版本转换到任何更新的版本,或者你可以只有 N 个转换器,每个转换器它们只能在两个连续的版本之间进行转换,并根据需要堆叠尽可能多的版本,以便从非常旧的版本逐步过渡到最新版本。

当然,在任何给定时间,只有接口的最新版本得到与实际数据库通信的实际实现的支持。