如何支持向后兼容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-Type
和Accept
头,两者都设置为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
标头。