代码之家  ›  专栏  ›  技术社区  ›  Olly

如何支持对Rails 2.3.4中接受头处理的更改的向后兼容性

  •  3
  • Olly  · 技术社区  · 16 年前

    在Rails 2.3.4中, Accept 已处理的邮件头已更改:

    http://github.com/rails/rails/commit/1310231c15742bf7d99e2f143d88b383c32782d3

    我们不会接受的

    Rails处理传入接受头的方式已更新。这主要是因为Web浏览器似乎并不总是知道他们想要什么……更不用说能够始终如一地表达出来。所以,accept头现在只用于xhr请求或单个项目头——这意味着它们不会请求所有东西。如果失败,我们将返回到使用参数[:格式]。

    同样值得注意的是,对您只声明了XML模板的操作的请求将不再自动呈现为HTML请求(浏览器请求)。这以前是有效的,不一定是按设计,但因为大多数浏览器发送一个catch-all-accept头(“ / “”。因此,如果要直接向浏览器提供XML,请确保提供:xml格式或显式指定XML模板(呈现“template.xml”)。

    我有一个活动的API,它正被许多同时发送 Content-Type 和一个 接受 标题,均设置为 application/xml . 这很好,但是我在Rails2.3.4下的测试表明这不再有效——我得到了403个未经授权的响应。移除 接受 头,只是发送 内容类型 可以,但这显然不是一个可接受的解决方案,因为它将要求我的所有客户重新编码他们的应用程序。

    如果我继续部署到Rails 2.3.4,所有使用API的客户端应用程序都将中断。如何修改我的Rails应用程序,使我可以在Rails 2.3.4上继续服务现有的API请求,而不必更改客户机的代码?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Jan De Poorter    16 年前

    如果我理解正确,问题就在请求头中。您可以简单地添加一个定制的机架中间件来修正它。

    快速创意:

    class AcceptCompatibility
      def initialize(app)
        @app = app
      end
    
      def call(env)
        if env['Accept'] == "application/xml" && env['Content-Type'] == "application/xml"
          # Probably an API call
          env.delete('Accept')
        end
        @app.call(env)
      end
    end
    

    然后在你的环境中。

    require 'accept_compatibility'
    config.middleware.use AcceptCompatibility
    
        2
  •  2
  •   Olly    16 年前

    令人尴尬的是,这实际上是一个Apache配置问题。一旦我解决了这个问题,一切都按预期工作。很抱歉。

    正如编码员乔正确指出的,设置 Content-Type 完全不需要标题--只需要设置 Accept 标题。

    推荐文章