如何在Rails中管理多个API

时间:2015-10-30 13:29:29

标签: ruby-on-rails api routes versioning

我有一个为多个客户端提供服务的Rails后端:

  • Angular JS App
  • iOS App

起初,我只有iOS应用程序,并且在对客户端进行重大更改时使用经典的API版本控制(命名我的版本v1v2等等)。

当我们提出Angular前端时,我们需要一个特定的API,所以我做了一个新版本,我只会使用Angular(比方说v5)。

此时,v1v4专用于iOS,v5专用于Angular。

显然,我可以同时更新我的​​后端以及我的Angular API,因为每次访问网站时都会将其提供给客户端。因此,不需要对Angular API进行版本控制。

但是,我正处于需要更新iOS API的地方,而且开始出现问题:v1 .. v4适用于iOS,{{1}是由Android采取的。所以假设的下一个iOS API应该是... v5?绝对错了。

我想知道是否可以命名API版本v6,并且由于这个answer on SO我理解为什么这是不可能的。我将为我的案例引用有趣的部分:

  

Ryan Bigg写道:

     

我无法弄清楚如何让angular匹配,因为您如何确定这应该是/api/asdf/users还是/api/<resource>/<identifier>的请求?

现在你了解我的情况,这就是问题。

问题

我应该如何管理多个API,但哪些不是真正的版本?

是否可以细分API版本?像:

  • /api/<version>/<resource>
  • api/angular/v1(将api/ios/v5 .. v1移至v4
  • api/ios/

有没有最佳做法?或者我应该只使用当前的API版本控制系统,知道哪个版本对应哪个客户端?

2 个答案:

答案 0 :(得分:1)

关于Ryan Bigg引用的路由问题,您可以通过对路由应用约束来解决它。例如:

get /api/:type/:version/users/all, to: "users#index", constraints: {type: /(ios|angular)/, version: /\d+/}

确保版本是一个数字,类型是&#34; ios&#34;或者&#34; angular&#34;,您可以轻松地为两个单独的API设置路由。

回答是否有可能的问题 - 是的。一切皆有可能,尤其是Ruby!

首先,我不会有两个单独的API来管理。但是,如果我这样做,我会为每个API创建单独的命名空间,并将其命名为AngularAPIIosAPI。我会分开路由他们。正确答案取决于您设置API系统的准确程度。

我如何维护两个单独的API?(来自评论)

这取决于API的实质差异。如果只有一些差异,那么简单地使用具有不同路由的不同控制器是有意义的。例如,AngularUsersControllerIosUsersController。它们都会扩展ApiUsersController并仅改变每个平台所需的内容。这仍然允许适当的版本控制,并保持代码重复。

答案 1 :(得分:1)

我认为最终这是一个设计问题。您的API应被视为在联网的MVC中访问您的模型的方法。就像在任何MVC中一样,模型应该独立于它的视图和控制器。我认为每个客户端使用不同的API几乎就像每个客户端都有不同的模型,我认为这不是你想要的。

作为一个例子,(我假设您的API是Restful),GET请求

api/v1/user/1

可能会返回用户1的json“视图”,应该编写每个客户端以使用相同的输出。如果您决定不再支持此功能,或者从返回的json中添加或删除某些会破坏现有客户端的内容,那么您可能会破坏该版本并对该版本实施更改

我建议您的下一个API版本公开您当前拥有的所有客户端所需的所有资源,然后加班更新您的客户端以使用这个新的统一API。如果您发现您的模型(API)的自我更改会破坏现有客户端,那么您可以发布新版本,允许现有客户端继续使用旧API,新的或更新的客户端可以获取新版本

对API进行一系列自动化测试有助于确定何时破坏现有客户端。

我不是这方面的专家,但我(作为一个学习项目)创建了一个带有api的rails应用程序,我能够使用相同的api for android和ios。