6

目前,我正在 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
4

3 回答 3

2

我曾经使用过相同的策略并且最近改变了方法——我承认我有偏见,因为我也是我们的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.

话虽如此,它需要采用新的版本控制方法,所以它可能不是最好的答案,但我认为这是一个值得考虑的选择。

于 2013-04-24T18:18:23.723 回答
1

你已经看过葡萄了吗?

我对我所构建的 API 所做的事情是,当所有这些 API 发生变化时(如身份验证),我只是让它们全部从特定版本的 API 控制器继承,并在Api::V1::BaseController其中放置常见的行为和控件。

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

于 2012-09-01T16:43:07.870 回答
1

这就是Grape的设计初衷。

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

于 2012-09-01T16:43:26.607 回答