只响应 Rails 中的 JSON


在我的 rails 应用程序中,只有 json,

每当有人调用我的 rails 应用程序并将 accept 标头设置为除 application/json 以外的任何内容时,我想发送 406 代码。我还希望它在将内容类型设置为除应用程序/json以外的任何内容时发送415

我的控制器respond_to :json 放在上面。我只在所有操作中渲染 json。 但是,我如何确保我为所有调用为所有其他接受标头/内容类型调用的任何内容返回错误代码 406/415,并且格式设置为除 json 以外的任何内容。

例如。如果我的资源是书籍/1 我想允许books/1.json 或 books/1,应用程序/JSON 在接受标头和内容类型中

关于如何执行这两个操作的任何想法?

基本上,您可以通过两种方式限制您的响应。

首先,控制器有respond_to。如果对未定义的格式发出请求,这将自动触发406 Not Acceptable

例:

class SomeController < ApplicationController
  respond_to :json

  def show
    @record = Record.find params[:id]
    respond_with @record
  end
end

另一种方法是添加一个before_filter来检查格式并做出相应的反应。

例:

class ApplicationController < ActionController::Base
  before_filter :check_format

  def check_format
    render :nothing => true, :status => 406 unless params[:format] == 'json' || request.headers["Accept"] =~ /json/
  end
end

您可以在 ApplicationController 中使用before_filter

before_filter :ensure_json_request
def ensure_json_request
  return if params[:format] == "json" || request.headers["Accept"] =~ /json/
  render :nothing => true, :status => 406
end

On rails 4.2+ respond_to已被删除,因此除非您只想为此导入完整的响应者 gem,否则最好的选择是推出自己的 gem。这是我在我的 rails 5 api 中使用的:

    class ApplicationController < ActionController::API
      before_action :force_json
      private
      def force_json
        # if params[_json] it means request was parsed as json 
        # if body.read.blank? there was no body (GET/DELETE) so content-type was meaningless anyway
        head :not_acceptable unless params['_json'] || request.body.read.blank?
      end
    end

相关内容

  • 没有找到相关文章

最新更新