簡體   English   中英

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

[英]How to support backwards compatibility with the changes to the Accept header handling in Rails 2.3.4

在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標頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM