在给出charset时,Rails无法解析Accept标头

时间:2013-09-22 00:27:47

标签: ruby-on-rails ruby character-encoding http-headers

在Rails应用程序中点击API时,似乎无法解析某些标头。例如,这有效:

Accept: application/json

但这不是:

Accept: application/json; charset=utf-8

是否未能理解第2个标题是标题的合法问题?即使它是,我怎么能让Rails理解它,或者至少理解它是对Json的请求?

1 个答案:

答案 0 :(得分:5)

问题在于,在Rails 3.2.14中,Mime::Type.parse方法不支持在Accept标头中指定charset参数;实际上它只支持“q”参数(参见Q_SEPARATOR_REGEXP常量)。

但是,在Rails 4中,该方法已更新为支持任意参数(请参阅this commit),因此升级到Rails 4应解决此问题。

如果您无法升级到Rails 4,我建议在一些Rack中间件中暂时破解以删除字符集(这假设您实际上并不打算遵守可接受的字符集):

class AcceptCharsetStripper
  def initialize(app)
    @app = app
  end

  def call(env)
    env["HTTP_ACCEPT"].gsub!(/;\s*charset=\S+/, "")
    @app.call(env)
  end
end