繁体   English   中英

Rails中优雅的API版本控制

[英]Elegant API versioning in Rails

目前我正在我们的Rails应用程序中实现REST API的版本控制。 有没有一种方法可以实现,所以你只在新版本中定义新功能? 比如说:

我有一个用户控制器和一个产品控制器。 V1和V2之间的产品保持不变,但用户已经改变。 如果我们可以设置它,那将是很好的,如果我呼吁产品的V2,我的应用程序知道它不存在,只是使用最新的控制器版本(在这种情况下,V1)。 这将允许我们不为每个版本创建一整套新的控制器; 我们只为已更改的特定功能创建新的控制器。

下面是我们Routes.rb的一个片段,不可否认,我不知道如何解决这个问题。 任何帮助将不胜感激!

namespace :api do
    scope module: :v1, constraints: ApiConstraints.new(version: 1) do
      resources :users
      resources :products
    end
    scope module: :v2, constraints: ApiConstraints.new(version: 2) do
      resources :users
    end 
end

我有时使用相同的策略,最近改变了方法 - 不可否认,我有偏见,因为我也是我们使用VersionCake的新方法的作者之一。

这种方法只是对我们的有效负载或视图进行版本化,后面的视图是客户端之间的合同,如果合同发生中断,那么版本需要更改。 在VersionCake中,您可以像这样对视图进行版本控制:

app/views/products/show.v1.rabl
app/views/products/show.v2.rabl
app/views/users/show.v1.rabl

根据您的问题,重要的特定功能是VersionCake将优雅地降级到最新支持的版本。 鉴于上面的示例,请求users/1.json版本2的客户端将接收users/show.v1.rabl的有效负载。

所有这些都说,它需要采用新的版本方法,所以它可能不是最好的答案,但我认为这是一个值得考虑的选择。

你看过Grape了吗?

我对我构建的API所做的是,当所有内容发生变化时(比如身份验证)我只是从特定的版本化api控制器继承它们,就像在Api::V1::BaseController放置公共行为和控制在那里。

由于更改API通常也意味着更改表示形式,使用为您生成表示形式的工具也非常重要,因此有很多宝石可供选择:

这就是Grape的设计目标。

此外,您可以选择将您的API安装在routes.rb文件中,或者将其映射到config.ru中,绕过Rails堆栈并大大提高API的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM