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

标签 ruby-on-rails ruby api ruby-on-rails-4 rails-api

我实际上正在开发一个使用 Rails 4 的 API。如果客户端未在 中指定媒体类型,我想将请求的 Content-Type 设置为 JSON Content-Type header 。

为了获得这种行为,我尝试在我的 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/

相关文章:

ruby-on-rails - 如何使用 Rspec 验证 rails 中属性的长度和数字

android - 从 Retrofit2 调用 Web 请求时如何解决致命异常?

ruby-on-rails - rails : How do I validate model based on parent's attributes?

ruby - 如何在 Ruby 中只执行一次方法?有静态变量吗?

javascript - jQuery append 跳过空格后的内容

api - 通过 API 访问 PayPal 捐赠基金慈善机构并向其捐款

ruby-on-rails - 将Youtube剪辑嵌入Rails应用程序

ruby-on-rails - 如何简化将多个值插入 Ruby 中的数组?

ruby-on-rails - 即使在指定belongs_to之后,我是否还需要明确提及has_many?

ruby-on-rails - "rails-api new"不工作