每当有人调用我的 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