我实际上正在开发一个使用 Rails 4 的 API。如果客户端未在 中指定媒体类型,我想将请求的
header 。Content-Type
设置为 JSON Content-Type
为了获得这种行为,我尝试在我的 ApplicationController
中添加以下 before_action
:
def set_request_default_content_type
request.format = :json
end
在我的 RegistrationsController#create
方法中,我有一个断点来检查是否一切正常。嗯,request.format
技巧不起作用,尽管值设置为 application/json
似乎 Controller (或 Rails 内部)不考虑收到的请求内容类型为 JSON。
我用以下正文(没有 Content-Type)做了一个 POST 请求:
{"user" : {"email":"foobar@mail.net","password":"foobarfoo"}}
通过使用 Pry 进行调试,我发现:
[2] api(#<V1::RegistrationsController>) _ request.format.to_s
=> "application/json"
[3] api(#<V1::RegistrationsController>) _ params
=> {
"action" => "create",
"controller" => "v1/registrations"
}
这意味着 Rails 没有考虑我的请求,request.format 配置为 Mime::JSON
,而是 Mime::ALL
,所以它没有' 解析请求的 JSON 正文。 :(
最佳答案
您可以在 respond_to
block 中定义一个 any
类型的响应,当请求 uri 以 .json
结尾时,这不会限制您的 Controller 响应>,它还可以让您免于明确定义响应类型,并将独立于请求内容类型,按照您的意愿进行响应,例如:
respond_to do |format|
format.any {render :json => {foo: 'bar'}}
end
关于ruby-on-rails - 强制所有收到的请求 Content-Type 为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22989389/