如何支持向后兼容Rails 2.3.4中Accept头处理的更改

在Rails 2.3.4中,处理Accept标头的方式已经改变:

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

我们不会接受它

Rails处理传入Accept头的方式已更新。 这主要是因为网络浏览器似乎并不总是知道他们想要什么……更不用说能够始终如一地表达它。 因此,Accept标头现在仅用于XHR请求或单个项目标头 – 这意味着它们不会请求所有内容。 如果失败,我们会回到使用params [:format]。

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

我有一个活动的API,许多客户端都使用它们同时发送Content-TypeAccept头,两者都设置为application/xml 。 这工作正常,但我在Rails 2.3.4下的测试表明这不再有效 – 我得到了403 Unauthorized响应。 删除Accept标头并仅发送Content-Type工作,但这显然不是一个可接受的解决方案,因为它将要求我的所有客户端重新编码他们的应用程序。

如果我继续部署到Rails 2.3.4,那么使用API​​的所有客户端应用程序都将中断。 如何修改我的Rails应用程序,以便我可以继续在Rails 2.3.4上提供现有API请求而无需客户端更改其代码?

如果我理解正确,问题出在Request标题中。 您只需添加一个自定义Rack中间件即可对其进行更正。

快速的想法:

 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 

然后在你的environment.rb中

 require 'accept_compatibility' config.middleware.use AcceptCompatibility 

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

正如coderjoe正确指出的那样,根本不需要设置Content-Type标头 – 只设置Accept标头。