2012-02-13 104 views
4

協作項目有一個Flash應用程序,它使用一種API(一種正在進行中的工作,一堆相關的PHP方法)。用於以JSON提供數據的API,但現在我們需要支持另一種格式。有幾種方法可以指示我們希望返回數據的格式。我想選擇HTTP Accept頭來避免重新發明輪子。帶Accept頭的URLRequest:放入請求正文,不會覆蓋默認請求頭

在我們的Flash應用程序中,我們有一組標準的負責設置Accept標頭的代碼。

var request:URLRequest = new URLRequest(url); 
var acceptHeader:URLRequestHeader = new URLRequestHeader("Accept", "application/json"); 
request.requestHeaders.push(acceptHeader); 
request.method = URLRequestMethod.POST; 
// add parameters, init a URLLoader, load the request etc. 

這在Internet Explorer和Chrome/Chromium上運行正常 - Web控制檯顯示標題已按預期更改(儘管降低了它們)。但是Firefox/Iceweasel表現出奇怪的行爲。根據內置的檢查,標準頭只得到傳遞的標題部分:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

運行Live HTTP頭(FF擴展),還可從應用率陌生人結果的請求(不重要頭省略,路徑改變等):

POST /path-to-script.phtml?id=1 HTTP/1.1 
Host: devserver.com 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
<...> 
    Referer: http://devserver.com/path-to-flash.swf 
    Content-Type: application/x-www-form-urlencoded 
    Accept: application/json 

    <POST payload> 

實際的有效負載是一個短截線作爲URLRequest不允許改變標頭的GET方法。有效負載和最後三個標頭也由於某種原因而縮進,使它們成爲請求主體的一部分而不是請求標頭。

瀏覽Firefox中的POST請求 - 實際上在Debian上的Iceweasel 9.01中,如果這一點很重要,在Win7上的FF10中也是如此 - 揭示了其他具有相同症狀的情況。即在community.adobe.com上,但來自SWF的請求伴隨着Accept頭和POST參數,指示所需的JSON格式。

因此,有兩個問題:

  1. 是否有可能真正覆蓋從通過火狐打開一個SWF文件的默認HTTP標頭?我們有什麼不對嗎?

  2. 這是一個更好的做法,重用這個HTTP工具,或者我們可能需要堅持一個額外的參數,並開始重寫URL到像/api/someObject.<json|xml>/123的東西?

+0

因爲我沒有找到一個緩解這個問題的好方法,所以我不得不忍受一個醜陋的黑客攻擊:'/ api/ /'得到mod_rewritten並傳遞給'兼容性連接器'模擬http accept頭,將輸入數據從'POST'移動到它應該是的任何地方(例如,將讀入方法寫入'GET'),並將執行傳遞給正在討論的方法。這樣我就可以在正常模式下通過jQuery和JS AJAX請求運行Flash。 – ashein 2012-02-21 12:19:59

回答

0
var acceptHeader:URLRequestHeader = new URLRequestHeader("Accept", "application/json"); 

這爲我們工作。謝謝