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