14

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

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

例如。如果我的资源是books/1,我想允许books/1.json 或books/1 使用application/json 接受标头和内容类型

关于我如何做这两个动作的任何想法?

4

3 回答 3

36

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

首先,有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
于 2013-01-29T09:46:32.023 回答
9

您可以使用 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
于 2013-01-29T09:45:35.553 回答
-1

在 Rails 4.2+ 上,respond_to 已被删除,因此除非您只想为此导入完整的响应者 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
于 2016-05-31T14:26:13.547 回答