维护API Rest的多个版本

时间:2015-06-16 15:24:57

标签: javascript ios node.js rest architecture

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

  1. 如何维护后端的多个版本?
  2. 如果代码中没有复杂的规则,这样做的好方法是什么?
  3. 如果我执行基本的不同倍数实例并使用正确的版本响应每个客户端,现在要处理数据库了吗?
  4. @MikeBrant如何建议我缩小范围

    我正在使用

    • 节点
    • 快速
    • 的Postgres

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

2 个答案:

答案 0 :(得分:1)

首先,REST用于消耗资源,而且可以 认为你准确地使用它来将它与后端实现分离 (这意味着它并不关心你使用哪个数据库,框架......)。

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

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

  1. 为第一个版本编写测试,这样您就不会破坏某些内容(强制性)
  2. 使用REST版本添加您的网址(与其他人一样,此处没有任何新内容),例如:api / v1 / ...或类似内容
  3. 由于您使用快递,您可以随时在路线前加上一些变量,比如apiPath(' api / v1'首先,' api / v2'),所以你结束了app.delete(apiPath +' / photos /:id')
  4. 之类的东西

    现在这就是它开始变得棘手的问题所在。 如果它只是模型域(可以保存/检索的新数据)比这容易。具有依赖于属性的getter / setter的Suplement模型 API版本。 让我们说你使用moongose: `

    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实际上已被弃用。

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

答案 1 :(得分:0)

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

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

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