在Rails上设计RESTful公共API的最佳实践是什么?

时间:2020-03-06 14:49:51  来源:igfitidea点击:

Rails附带了RESTful资源,但是我们是否将这些资源用于实际的公共API?如果是这样,我们将如何完成API的版本控制,即" example.com/api/v2/foo/bar"?

解决方案

通常,用于我的应用程序的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之类的URL;后者会为我们提供诸如example.com/posts.v1和example.com/posts.v2之类的网址