Ruby on rails 如何在Rails中管理多个API
我有一个Rails后端,可为多个客户端提供服务:Ruby on rails 如何在Rails中管理多个API,ruby-on-rails,api,routes,versioning,Ruby On Rails,Api,Routes,Versioning,我有一个Rails后端,可为多个客户端提供服务: Angular JS应用程序 iOS应用程序 起初,我只有iOS应用程序,当客户端发生重大变化时,我在rails中使用了经典的API版本控制(命名我的版本v1,v2等等) 当我们提出Angular前端时,我们需要一个特定的API,所以我做了一个新版本,我只使用Angular(比方说v5) 此时,v1到v4专用于iOS,v5专用于Angular 显然,我可以同时更新我的后端和Angular API,因为每次客户端访问网站时,都会为它们提供服务。
- Angular JS应用程序
- iOS应用程序
v1
,v2
等等)
当我们提出Angular前端时,我们需要一个特定的API,所以我做了一个新版本,我只使用Angular(比方说v5
)
此时,v1
到v4
专用于iOS,v5
专用于Angular
显然,我可以同时更新我的后端和Angular API,因为每次客户端访问网站时,都会为它们提供服务。因此,无需对Angular API进行版本控制
然而,我现在需要更新我的iOS API,它开始变得非常错误:v1
。v4
用于iOS,而v5
由Android使用。所以下一个iOS API应该是<代码>v6?绝对错了
我想知道是否有可能命名API版本angular
,正因为如此,我理解了为什么这是不可能的。我将为我的案例引用有趣的部分:
写道:
我不知道如何让/api/asdf/users
匹配,因为您如何确定这是对/api/
还是/api/
的请求
现在你更了解我的处境了,问题来了
问题
我应该如何管理多个API,但哪些API与版本不太一样
可以细分API版本吗?比如:
api/angular/v1
(也将api/ios/v5
。v1
移动到v4
)api/ios/
api/android/v1
是否有这样做的最佳实践?或者我应该使用当前的API版本控制系统,知道哪个版本对应于哪个客户端?关于引用Ryan Bigg的路由问题,您可以通过对路由应用约束来解决它。例如:
get /api/:type/:version/users/all, to: "users#index", constraints: {type: /(ios|angular)/, version: /\d+/}
确保版本为数字且类型为“ios”或“angular”,您可以轻松地为两个单独的API设置路由
回答是否可能的问题——是的。任何事情都是可能的,尤其是使用Ruby
一、 首先,我们不需要管理两个单独的API。但是,如果我这样做了,我将为每个API创建单独的名称空间,并将其命名为AngularAPI
和IosAPI
。我只想分别去他们那里。正确答案将取决于您如何准确设置API系统
如何维护两个独立的API?(摘自评论)
这取决于API有多大的不同。如果只有一些差异,那么简单地使用具有不同路由的不同控制器是有意义的。例如,
AngularUsersController
和IOUsersController
。它们都将扩展ApiUsersController,并且只更改每个平台所需的内容。这仍然允许在其增长过程中进行适当的版本控制,并防止代码重复。我认为最终这是一个设计问题。您的API应该被认为是在网络化MVC中访问您的模型的方法。就像在任何MVC中一样,模型应该独立于它的视图和控制器。我认为每个客户端都有一个不同的API几乎就像每个客户端都有一个不同的模型,我不认为这是您想要的
例如,(我假设您的API是Restful的),GET请求
api/v1/user/1
可能会返回用户1的json“视图”,您的每个客户端都应该编写为使用相同的输出。如果您决定不再支持此功能,或者从返回的json中添加或删除某些内容,这将破坏现有的客户端,那么您可能会升级版本并在该版本上实现更改
我建议您的下一个API版本公开您当前拥有的任何客户端所需的所有资源,然后超时更新您的客户端以使用此新的统一API。如果您发现自己对模型(API)所做的更改会破坏现有客户机,则可以发布新版本,允许现有客户机继续使用旧API,新的或更新的客户机可以获取新版本
API上的一组自动化测试将有助于确定何时破坏现有客户机
我不是这方面的专家,但我(作为一个学习项目)创建了一个带有api的rails应用程序,并且我能够在android和ios上使用相同的api。谢谢你的回答,这绝对是我可以使用的。但是有一点你是对的,我也不喜欢我必须维护两个完全分离的API。也许我把整个API版本控制都搞错了。您如何管理多个客户端API,知道例如使用iOS,您不能期望您的用户更新客户端,也不能立即发布您的新版本(Apple App review process…)?再次感谢!这是一个有价值的答案,我可以用它来决定做什么。由于API目前确实不同,我想我会首先将控制器中的大部分逻辑转移到模型中,然后考虑处理这些不同客户端的路由。该应用程序很复杂,Rails后端起初还没有被认为能够处理iOS,因此,angular和iOS所需的数据之间存在很大差异。如果我们按照您的方式(为每个客户端使用一个通用API),最困难的部分将是更新我们的iOS应用程序以处理新的API。但我认为这是我们能够负担得起的,因为它将简化很多维护工作……我接受了这个答案,因为经过精简后