2009-10-23 113 views
3

在Rails 2.3.4,Accept頭的處理方式已經改變了更改Accept頭在Rails的處理:如何支持向後兼容2.3.4

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

我們贏了't接受它

Rails處理傳入Accept頭的方式已更新。這主要是因爲網絡瀏覽器似乎並不總是知道他們想要什麼......更不用說能夠一致地表達它。所以,Accept標頭現在僅用於XHR請求或單個項目標頭 - 這意味着它們沒有請求所有內容。如果失敗了,我們回到使用params [:format]。

還值得注意的是,對於僅聲明XML模板的操作的請求將不再自動爲HTML請求(瀏覽器請求)呈現。這以前工作,不一定是按照設計,但因爲大多數瀏覽器發送全部接受頭(「/」)。因此,如果您想直接向瀏覽器提供XML,請務必提供:xml格式或明確指定XML模板(呈現「template.xml」)。

我有一個正在使用的許多客戶主動API誰都是派出了一個Content-TypeAccept頭,都設置爲application/xml。這工作正常,但我在Rails 2.3.4下的測試表明,這不再有效 - 我得到了一個403未經授權的響應。刪除Accept標題並僅發送Content-Type作品,但這顯然不是一個可接受的解決方案,因爲它會要求我的所有客戶重新編寫其應用程序。

如果我繼續部署到Rails 2.3.4,所有使用該API的客戶端應用程序都將中斷。我如何修改我的Rails應用程序,以便繼續在Rails 2.3.4上爲現有API請求提供服務,而無需客戶端更改其代碼?

+1

爲什麼你的客戶設置content-type:application/xml?他們是否發送XML數據以及他們的獲取/發佈請求?接受標題不是用來指定您將接受的格式,而是用於定義您發送的格式的內容類型? – coderjoe 2009-10-23 14:29:53

+0

這個錯誤是否發生在你所有的路線/動詞上?如果你傳遞application/xml內容並且接受頭部到需要數據的動詞,你仍然會得到這個錯誤?我無法重現您的問題。更多信息,將不勝感激。 – coderjoe 2009-10-23 15:10:20

+0

Content-type的使用最初被添加到API中,但您建議的並不是嚴格必要的 - 它是Accept頭,Rails使用它來確定要響應哪個Mime類型。我無法在我的開發環境中在本地重現這一點。它實際上可能是Apache的問題嗎? – Olly 2009-10-26 12:07:41

回答

2

令人尷尬的是,這其實原來是一個Apache配置問題。一旦我解決了這個問題,一切都按預期工作。對於那個很抱歉。

正如coderjoe正確指出的那樣,根本不需要設置Content-Type標頭 - 僅設置Accept標頭。

+1

如果您不介意,發佈關於Apache配置的快速簡介可能有助於未來用戶遇到同樣的問題。 :)很高興你發現了這個問題! – coderjoe 2009-10-26 14:03:27

2

如果我理解正確,問題出現在請求標頭中。您可以簡單地添加一個自定義的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 
+0

這個解決方案不會讓您無法在請求XML響應時將XML數據發佈到控制器嗎? – coderjoe 2009-10-23 19:47:54