在轨2.3.4的方式 Accept 头处理已经发生了变化:

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

我们不会接受它

在其轨道来处理传入接受的标题已经更新。这主要是由于事实上,网络浏览器不总是似乎知道他们想要什么...让我们单独能够始终如一地阐明。因此,接受头,现在只用于把要求或单个项目的头-这意味着他们不是请求的一切。如果失败,我们回落到使用params[形式].

这也是值得注意的请求一个行动中,你们只有宣布XML模板将不再自动呈现为一个HTML请求(浏览器的要求)。这以前的工作,不一定通过设计,但因为大多数浏览器发送一个包罗万象的所有受header("/").所以,如果你想为XML直接浏览,以确保提供:xml格式或明确指定的XML模板(呈现"template.xml").

我有一个活跃的API其是正在使用的许多客户的所有发送两个 Content-Type 和一个 Accept 头,两者都设定为 application/xml.这个工作很好,但是我的测试在轨2.3.4表明,这已不再工作的-我得到一个403未经授权的响应。删除 Accept 标题,只是发送 Content-Type 工作原理,但这显然不是一个可接受的解决方案,因为它将要求所有我客户的重码应用程序。

如果我继续部署到轨2.3.4所有客户应用程序的使用API将打破。我怎么可以修改我的轨道应用程序,这样我可以继续担任现有的API请求在轨道上2.3.4不客户具有以改变他们的代码?

有帮助吗?

解决方案 2

令人尴尬的足够,这实际上变成了一个Apache配置问题。一旦我解决这个,一切工作,如预期的那样。遗憾。

作为coderjoe正确指出的,设置 Content-Type 头没有必要在所有--只有设置的 Accept 头。

其他提示

如果我理解正确的问题是在请求头。你可以简单地添加一个自定义架中件,纠正。

快速的想法:

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

然后在你的环境。rb

require 'accept_compatibility'
config.middleware.use AcceptCompatibility
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top