维护一个API Rest的多个版本

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

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

如何@MikeBrant先生我会减less范围

我在用着

  • 节点
  • performance
  • Postgres的

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

迈克是正确的,很难说你的特定API的最佳解决scheme可能是什么。 但是,为了给您提供一个可能的解决scheme,下面是维护不同API版本的一个非常简单的方法。 当然,这是基于很多假设,可能不是您的API的最好或最干净的解决scheme。

对于简单的API,您可以通过在应用程序中定义常量来维护不同的版本。 这个常量将成为您的API端点的根目录。 通常情况下,这个名称应该与您的应用版本相同,比如“myApp / v1-8-5 /”,前提是您的应用版本是1.8.5。 服务器端,你会维护一个目录,每个版本的应用程序将包含完整的API。 您的应用程序的每个新版本都会更新常量并将新目录添加到您的端点。

这不是最优雅的解决scheme,如前所述,它可能不是您的需求的最佳解决scheme,但它是一个解决scheme….

首先,REST是为了消耗资源,有人可能会争辩说,您正是使用它来将其从后端实现中分离出来(这意味着它不关心使用哪个数据库,框架等)。

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

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

  1. 写第一个版本的testing,所以你不会破坏的东西(强制性)
  2. 前缀与REST版本(像其他人一样,这里没有新的),例如:API / V1 / …或类似的东西
  3. 既然你使用的是express,你总是可以在路由前加上一些variables,比如说apiPath('api / v1','api / v2'),所以你最终得到了类似于app.delete(apiPath +'/ photos /:ID')

现在,这是它开始变得棘手,那是你的问题的领域。 如果只是模型领域(可以保存/检索的新数据)比这很容易。 使用取决于API版本的属性的getter / setter的补充模型。 可以说你用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中的某些内容,那么我认为只有两个选项,第一个API的弃用或数据迁移,当用户最终更新他们的应用程序。 如果他们使用不同的应用程序版本相同的帐户这仍然意味着对他们来说旧的API是实用的弃用。

我希望这对你有所帮助。 让我知道如果你有更多的问题,或者如果你可以更详细地指定你的问题,我会尝试更新答案。 `