Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中管理多个API_Ruby On Rails_Api_Routes_Versioning - Fatal编程技术网

Ruby on rails 如何在Rails中管理多个API

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,因为每次客户端访问网站时,都会为它们提供服务。

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

  • Angular JS应用程序
  • iOS应用程序
起初,我只有iOS应用程序,当客户端发生重大变化时,我在rails中使用了经典的API版本控制(命名我的版本
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。但我认为这是我们能够负担得起的,因为它将简化很多维护工作……我接受了这个答案,因为经过精简后