扶手:限制API请求JSON格式(Rails: Restrict API requests to J

2019-08-16 16:52发布

我想限制要求所有API控制器被重定向到JSON路径。 我想使用重定向,因为还URL应根据响应改变。
一种选择是使用before_filter其将请求重定向到同样的动作,但强制JSON格式。 这个例子不工作呢!

# base_controller.rb
class Api::V1::BaseController < InheritedResources::Base
  before_filter :force_response_format
  respond_to :json
  def force_response_format
    redirect_to, params[:format] = :json
  end
end

另一种选择是,以限制路由设置的格式。

# routes.rb
MyApp::Application.routes.draw do
  namespace :api, defaults: { format: 'json' } do
    namespace :v1 do
      resources :posts
    end
  end
end

我希望所有的请求,最终成为一个JSON请求:

http://localhost:3000/api/v1/posts
http://localhost:3000/api/v1/posts.html
http://localhost:3000/api/v1/posts.xml
http://localhost:3000/api/v1/posts.json
...

你会推荐哪种策略?

Answer 1:

在你的路由设置默认不会把所有的请求成JSON请求。

你需要的是确保无论你是渲染JSON响应

你很可能有它的第一个选项,除非你需要这样做

before_filter :set_default_response_format

private
  def set_default_response_format
    request.format = :json
  end

这将您的基本API控制器去下,这样当它到达你的实际行动格式将永远是JSON。



Answer 2:

如果你想返回404,或提出一个RouteNotFound错误,如果格式不:json ,我想补充一个路由约束是这样的:

需要JSON格式:

# routes.rb
MyApp::Application.routes.draw do
  namespace :api, constraints: { format: 'json' } do
    namespace :v1 do
      resources :posts
    end
  end
end

更多信息可以在这里找到: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints



Answer 3:

第二个选项,使用路线格式。 如果用户明确要求一个XML格式的,他不应该收到的JSON响应。 他应该得到一个消息,说这个URL不回答为XML格式,或404。

顺便说一句,这将是相当容易为所有这是你应该在我看来,做什么回应。

class FooController
  respond_to :xml, :json
  def show
    @bar = Bar.find(params[:id])
    respond_with(@bar)
  end
end


文章来源: Rails: Restrict API requests to JSON format