我有一个为多个客户端提供服务的Rails后端:
起初,我只有iOS应用程序,并且在对客户端进行重大更改时使用经典的API版本控制(命名我的版本v1
,v2
等等)。
当我们提出Angular前端时,我们需要一个特定的API,所以我做了一个新版本,我只会使用Angular(比方说v5
)。
此时,v1
到v4
专用于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版本控制系统,知道哪个版本对应哪个客户端?
答案 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创建单独的命名空间,并将其命名为AngularAPI
和IosAPI
。我会分开路由他们。正确答案取决于您设置API系统的准确程度。
我如何维护两个单独的API?(来自评论)
这取决于API的实质差异。如果只有一些差异,那么简单地使用具有不同路由的不同控制器是有意义的。例如,AngularUsersController
和IosUsersController
。它们都会扩展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。