如何在Rails上设计RESTful公共API的最佳实践?

9

Rails自带RESTful资源,但你是否将其用于实际的公共API?如果是,你如何实现API版本控制,例如example.com/api/v2/foo/bar?

1个回答

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) 您还可以考虑为每个版本添加自定义响应格式

在 initializers/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的URL。

如果实际的业务逻辑不同,版本控制的另一个选择是使用命名空间路由。 - Kris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接