【问题标题】:how to disable content negotiation with accept_header in Rails 3.2如何在 Rails 3.2 中使用 accept_header 禁用内容协商
【发布时间】:2012-10-20 18:00:03
【问题描述】:

我有一个应用程序,其中包含指向 /something/orders.xml 之类的控制器的链接,该控制器使用 RABL 构造 XML 文档。有效,但似乎由于浏览器的请求标头,这在某些浏览器中以 text/html 的形式返回,例如 Chrome:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

我希望回复有Content-type: text/xml,因为它就是这样!所以,根据许多howtos和Rails Guides,你可以这样做

config.action_controller.use_accept_header = false

application.rb。但这目前导致undefined method use_accept_header=

/home/sbeam/.rvm/gems/ruby-1.9.3-p194@global/gems/actionpack-3.2.6/lib/action_controller/railtie.rb:41:in `block (3 levels) in <class:Railtie>': undefined method `use_accept_header=' for ActionController::Base:Class (NoMethodError)

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您应该能够通过设置response.headers 来覆盖控制器操作中的内容类型:

    respond_to do |format|
      format.html
      format.json { render :json => @orders }
      format.xml do
        response.headers['content-type'] = 'text/xml'
        render :xml => @orders
      end
    end
    

    编辑

    在 Rails 3.0 之后,设置 use_accept_header 的选项已被弃用。

    如果您无法在您的操作中覆盖格式,您可以尝试直接修改您的 mime 类型。您可以将以下内容放入 Rails 中的初始化程序中:

    Mime.send(:remove_const, :xml)
    Mime::Type.register "text/xml", :xml
    

    此外,如果您使用 JQuery 并通过 ajax 检索 XML,则可以显式设置所需的内容类型。看到这个问题:Cannot properly set the Accept HTTP header with jQuery

    编辑 2

    如果一切都失败了,你可以使用:

    ActionDispatch::Request.ignore_accept_header = true
    

    在您的配置中完全关闭内容协商。如上所述,您可能希望通过 ajax 请求控制您希望接收的数据格式。如果是这样,那么您可以在 https://github.com/econsultancy/rack-strip_http_accept_headers 处实施机架中间件更改。

    【讨论】:

    • 是的,但我想关键是我不应该这样做(而且因为这个方法实际上是在一个引擎中,这样做有点痛苦)。客户端请求了一个 .xml 文件,那么为什么我必须添加这个样板来强制 Rails 以匹配的标头响应?
    • 如果您想避免使用样板,请查看 respond_with apidock.com/rails/ActionController/MimeResponds/respond_with
    • @max_w 与respond_with 发生同样的事情:Rails 为所有格式发送Content-type: text/html
    • @mccannf 更改 Mime::Type 注册表没有效果,一开始就已经是 application/xml。似乎 Rails 忽略了它,遵从 Accept: 标头。这不是 AJAX 调用,它更像是一个 API。无论如何,我再说一遍,我们也不应该依赖客户端的标头 - 谁知道某些第 3 方会发送什么?
    • @sbeam - 如果一切都失败了,添加了一些尝试;)
    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多