【问题标题】:How do multiple versions of a REST API share the same data model?一个 REST API 的多个版本如何共享同一个数据模型?
【发布时间】:2015-09-03 07:34:18
【问题描述】:

有大量关于如何管理 RESTful Web 服务版本控制的学术理论和最佳实践的文档,但是我没有看到太多关于多个 REST API 如何与数据交互的讨论。

我希望查看各种架构策略或文档,了解如何处理托管依赖于同一数据池的多个应用版本。

例如,假设您对数据库表进行了数据库级别的破坏性更改,导致您必须将主要 API 版本增加到 v2。 现在,在任何给定时间,用户都可以同时与 v1 Web 服务和 v2 Web 服务交互,并创建对这两个服务可见和可编辑的数据。这个应该怎么处理?

【问题讨论】:

    标签: api rest database-design versioning


    【解决方案1】:

    大多数引入 API 的更改都会影响响应的内容,直到引入的更改是增量的,这不是一个很大的问题(注意:您永远不应该将确切的数据库模型直接暴露给客户端)。

    当您对数据库模型进行破坏性/重大更改并引入新的 API 版本的 API 时,有两种选择:

    1. 关闭以前的版本,过滤掉所有查询以回复 301 和新位置。
    2. 如果 1. 不可能需要维护 API 的先前版本和当前版本。由于这可能会耗费时间和金钱,因此应该只执行一段时间,最后应该关闭以前的版本。

    DB 模型呢?当两个版本的 API 同时处于活动状态时,我会尽量保持数据库模型的一致性——记住同时运行两个版本只是暂时的。但正如我之前写的,DB 模型永远不应该直接暴露给客户端——这可以帮助你避免很多问题。

    【讨论】:

    • 感谢您回答 Opal,但我不确定在这种情况下只有两个选项。您的第一个选项(停用端点)没有弃用期,并且不会向该 API 的使用者发出警告。我永远不会向任何人推荐这种策略。此外,它也违背了问题的要求。第二个选项没有提到如何处理数据库模型,只是说避免对数据库模型进行更改。如果必须更改数据库模型,而您想做“选项 2”怎么办?
    • 抱歉,我没有提到停用 V1 的弃用期,因为这对我来说很明显。我的错。当然,您不能让客户毫无准备,就直接将其切断。当谈到更改的数据库模型时,请查看我答案的最后一段。它不应该直接暴露给客户。如果你这样做,你就迷路了;)
    【解决方案2】:

    我已经考虑过了...

    一个解决方案可能是这样的:

    仅仅因为 v1 API 不应该改变,并不意味着底层实现不能改变。您可以修改 v1 实现代码以设置默认值、省略字段的保存、返回未经检查的异常或执行某种计算逻辑来帮助 v1 API 与共享数据源兼容。然后,在 v2 中实现一个更好、更简洁、更理想化的实现。

    【讨论】:

      【解决方案3】:

      当您要更改 API 结构中可能会更改响应的任何内容时,您最需要提高 API 版本。
      例如,您有此请求和响应:
      请求帖子:a, b, c, d 回复:{a,b,c+d}

      您将在从数据库获取的响应中添加'e'
      如果您在当前客户端版本中没有基于'e' 的任何更改,您可以将其添加到您当前的 API 版本中。 但是,如果您的新更改将更改最后的响应,例如: 回复:{a+e, b, c+d} 你最好增加 API 数量以防止崩溃。

      请求输入的变化是一样的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        • 2019-10-01
        • 2023-04-02
        • 2019-01-04
        • 2012-01-09
        • 1970-01-01
        相关资源
        最近更新 更多