首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails路由的API版本控制

Rails路由的API版本控制
EN

Stack Overflow用户
提问于 2012-03-09 09:04:02
回答 4查看 34.2K关注 0票数 144

我正试着像Stripe一样对我的API进行版本控制。下面给出的是最新的API版本为2。

/api/users/api/v2/users返回301

/api/v1/users返回版本1的200个用户索引

/api/v3/users/api/v2/users返回301

/api/asdf/users/api/v2/users返回301

因此,基本上任何未指定版本的内容都会链接到最新版本,除非存在指定的版本,然后重定向到该版本。

这就是我到目前为止所知道的:

代码语言:javascript
复制
scope 'api', :format => :json do
  scope 'v:api_version', :api_version => /[12]/ do
    resources :users
  end

  match '/*path', :to => redirect { |params| "/api/v2/#{params[:path]}" }
end
EN

回答 4

Stack Overflow用户

发布于 2012-03-09 14:47:02

有几件事要补充:

你的重定向匹配对于某些路由是不起作用的-- *api参数是贪婪的,会吞噬所有东西,例如/api/asdf/users/1会重定向到/api/v2/1。您最好使用像:api这样的常规参数。诚然,它不能匹配像/api/asdf/asdf/users/1这样的情况,但是如果你的应用程序接口中有嵌套的资源,这是一个更好的解决方案。

为什么你不喜欢namespace?:-),例如:

代码语言:javascript
复制
current_api_routes = lambda do
  resources :users
end

namespace :api do
  scope :module => :v2, &current_api_routes
  namespace :v2, &current_api_routes
  namespace :v1, &current_api_routes
  match ":api/*path", :to => redirect("/api/v2/%{path}")
end

这具有版本化和通用命名路由的附加好处。另请注意-使用:module时的约定是使用下划线表示法,例如:api/v1而不是'Api::V1‘。后者一度不起作用,但我相信它已经在Rails3.1中修复了。

此外,当您发布API的v3时,路由将像这样更新:

代码语言:javascript
复制
current_api_routes = lambda do
  resources :users
end

namespace :api do
  scope :module => :v3, &current_api_routes
  namespace :v3, &current_api_routes
  namespace :v2, &current_api_routes
  namespace :v1, &current_api_routes
  match ":api/*path", :to => redirect("/api/v3/%{path}")
end

当然,您的API很可能在不同版本之间具有不同的路由,在这种情况下,您可以这样做:

代码语言:javascript
复制
current_api_routes = lambda do
  # Define latest API
end

namespace :api do
  scope :module => :v3, &current_api_routes
  namespace :v3, &current_api_routes

  namespace :v2 do
    # Define API v2 routes
  end

  namespace :v1 do
    # Define API v1 routes
  end

  match ":api/*path", :to => redirect("/api/v3/%{path}")
end
票数 38
EN

Stack Overflow用户

发布于 2012-03-15 22:15:31

如果可能的话,我建议您重新考虑您的url,这样版本就不在url中,而是放在accepts头中。这个堆栈溢出的答案很好地解释了这个问题:

Best practices for API versioning?

这个链接准确地展示了如何使用rails路由实现这一点:

http://freelancing-gods.com/posts/versioning_your_ap_is

票数 13
EN

Stack Overflow用户

发布于 2012-11-22 07:58:40

我对按路由进行版本控制不是很感兴趣。我们构建VersionCake是为了支持更简单的应用程序接口版本控制。

通过在每个视图(jbuilder,RABL等)的文件名中包含API版本号,我们保持了版本控制的简洁性,并允许容易降级以支持向后兼容(例如,如果视图的v5不存在,我们将呈现视图的v4 )。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9627546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档