Rails带有开箱即用的RESTful资源,但您是否将它们用于实际的公共API?如果是这样,您将如何完成API的版本控制,即example.com/api/v2/foo/bar
?
答案 0 :(得分:11)
通常,我的应用程序的API确实构建在构成HTML界面的相同资源上。对于一些人(不是我),这可能只是使用来自脚手架生成器的代码 - 但无论我是自定义编写还是让生成器处理它,很少有实例我只将资源暴露给程序员API而不是最终用户视图。
版本控制对我迄今为止构建的应用程序来说不是问题,但我可以想到两种方法来实现它。
1)您可以添加前缀为“v1”,“v2”等的路由,这些路由会设置一个参数,您可以在控制器中访问该参数以指定要进行的处理:
在routes.rb中:
map.resources :posts, :path_prefix => '/:version'
在posts_controller.rb中
class PostsController < ApplicationController
def index
respond_to do |format|
format.xml do
if params[:version] == 'v1'
# ...
else
# ...
end
end
end
end
end
2)您还可以考虑为每个版本添加自定义响应格式
初始化器中的/ mime_types.rb
Mime::Type.register_alias "application/xml", :v1
Mime::Type.register_alias "application/xml", :v2
在posts_controller.rb中
class PostsController < ApplicationController
def index
respond_to do |format|
format.v1 do
# ...
end
format.v2 do
# ...
end
end
end
end
前者会为您提供例如example.com/v1/posts.xml和example.com/v2/posts.xml的网址;后者会为您提供例如example.com/posts.v1和example.com/posts.v2
的网址