维护多个版本的 API Rest

Maintain multiple versions of an API Rest

本文关键字:API Rest 版本 维护      更新时间:2023-09-26

我有一个用Express制作的API Rest,它由iOS客户端使用。 有时我必须对某些端点进行更改(重大更改),我将发布新版本的 iOS 应用程序,但可能会发生并非所有用户都更新客户端事件,如果客户端正在运行应用程序并且我部署了新的后端版本。

  1. 如何维护多个版本的后端?
  2. 在代码中没有复杂规则的情况下执行此操作的好方法
  3. 如果我使用正确的版本对每个客户端执行不同的多个基本实例和响应,现在处理数据库?

我将如何@MikeBrant缩小范围

我正在使用

  • 节点
  • 表达
  • 波斯特格雷斯

我没有使用像sailjs或loopback这样的框架

首先,REST是用来消耗资源的,可以争辩说你使用它正是为了将其与后端实现分离(这意味着它不在乎哪个数据库,框架,...你使用)。

其次,如果你真的有第一个版本的完整实现,那么它应该被冻结,这意味着不要接触后端实现对于该版本,请复制路由并相应地更改它们。

恕我直言(我会做什么):

  1. 为第一个版本编写测试,这样你就不会破坏某些东西(强制性)
  2. 为您的网址添加 REST 版本前缀(像其他人一样,这里没有什么新内容),例如:api/v1/...或类似的东西
  3. 由于你使用的是 express,你总是可以用一些变量作为路由的前缀,比如说 apiPath('api/v1' 代表第一个,'api/v2'),所以你最终会得到类似 app.delete(apiPath + '/photos/:id')

现在这是它开始变得棘手的地方,这就是你的问题领域。如果它只是模型域(可以保存/检索的新数据),那么这很容易。具有吸气剂/二传手的补充模型,其使用的属性取决于接口版本。假设您使用月亮:`

userSchema.virtual('v1_properties').get(function() {
    return ['email', 'name'];
});
userSchema.virtual('v2_properties').get(function() {
    return ['email', 'name', 'surname'];
});
modelSchema.virtual('attributes').get(function() {
    // atributes that are prefixed with api version
    var self = this;
    var json = {};
    self[apiVersion + '_properties'].foreach(function(key) {
        json[key] = self[key];
    });
    return json;
});

'对于二传手,你做同样的事情。当然,这对夫妇来说是个坏主意带有模型的 API 版本,仅用于示例目的。

遗憾的是,如果您更改了特定的业务逻辑,这并不能解决问题。请记住,弃用是有原因的。如果您的更改确实破坏了旧 API 中的某些内容,那么我认为那里只有 2 个选项,弃用第一个 API 或迁移数据时用户最终更新他们的应用程序。如果他们为同一帐户使用不同的应用程序版本,这仍然意味着对他们来说,旧的API是实用的弃用。

我希望这在某种程度上对您有用。如果您有更多,请告诉我问题,或者如果您可以更详细地指定您的问题,我会尝试以更新答案。`

Mike 是对的,很难说出针对您的特定 API 的最佳解决方案是什么。但是,为了向您提供可能的解决方案,这里有一种非常简单的方法来维护不同的 API 版本。 当然,这是基于许多假设,可能不是您的API的最佳或最干净的解决方案。

对于简单的 API,可以通过在应用中定义常量来维护不同的版本。此常量将是指向 API 终结点根目录的路径。 通常,这将与应用版本同名,例如"myApp/v1-8-5/"(假设应用版本为 1.8.5)。 服务器端,您将为每个版本的应用维护一个目录,其中包含完整的 API。 应用的每个新版本,都需要更新常量并将新目录添加到终结点。

这不是最优雅的解决方案,如前所述,它可能不是满足您需求的最佳解决方案,但它是一个解决方案。