强制所有收到的请求Content-Type为JSON

Mic*_*ich 13 ruby api ruby-on-rails rails-api ruby-on-rails-4

我实际上正在使用一个使用Rails 4的API.Content-Type如果客户端没有在Content-Type头文件中指定媒体类型,我想将请求设置为JSON .

为了获得该行为,我尝试before_action在我的添加中添加以下内容ApplicationController:

def set_request_default_content_type
  request.format = :json
end
Run Code Online (Sandbox Code Playgroud)

在我的RegistrationsController#create方法中,我有一个断点来检查一切是否正常.好吧,request.format诀窍不起作用,尽管设置的值application/json似乎控制器(或Rails内部)不会将接收到的请求的Content-Type视为JSON.

我使用以下正文进行了POST请求(并且没有Content-Type):

{"user" : {"email":"foobar@mail.net","password":"foobarfoo"}}
Run Code Online (Sandbox Code Playgroud)

通过Pry调试我看到:

 [2] api(#<V1::RegistrationsController>) _  request.format.to_s
 => "application/json"
 [3] api(#<V1::RegistrationsController>) _  params
 => {
       "action" => "create",
   "controller" => "v1/registrations"
 }
Run Code Online (Sandbox Code Playgroud)

这意味着Rails没有使用配置的request.format考虑我的请求Mime::JSON,而是使用Mime::ALL,因此它没有解析请求的JSON主体.:(

hou*_*se9 -1

您应该能够使用路由设置默认格式:http://guides.rubyonrails.org/routing.html#defining-defaults

\n
resources :registrations, ... defaults: { format: \'json\' }\n
Run Code Online (Sandbox Code Playgroud)\n

另请参阅:如何在 Rails 中设置路由的默认格式?\nrails 中的路线格式?answertab=active#tab-top

\n
\n

也许还感兴趣:

\n\n
\n

当包含 \xe2\x80\x9c,/\xe2\x80\x9d 或 \xe2\x80\x9c/,\xe2\x80\x9d 时,Rails 会忽略接受头并返回 HTML(如果是 \xe2\x80\ 则返回 JS) x99s 是 xhr 请求)。

\n

这是设计使然,从浏览器访问时始终返回 HTML。

\n

这并不遵循 mime 类型协商规范,但它是规避带有错误接受标头的旧浏览器的唯一方法。他们让他接受第一个 mime 类型为 image/png 或 text/xml 的标头。

\n
\n