協作項目有一個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格式。
因此,有兩個問題:
是否有可能真正覆蓋從通過火狐打開一個SWF文件的默認HTTP標頭?我們有什麼不對嗎?
這是一個更好的做法,重用這個HTTP工具,或者我們可能需要堅持一個額外的參數,並開始重寫URL到像
/api/someObject.<json|xml>/123
的東西?
因爲我沒有找到一個緩解這個問題的好方法,所以我不得不忍受一個醜陋的黑客攻擊:'/ api/。 /'得到mod_rewritten並傳遞給'兼容性連接器'模擬http accept頭,將輸入數據從'POST'移動到它應該是的任何地方(例如,將讀入方法寫入'GET'),並將執行傳遞給正在討論的方法。這樣我就可以在正常模式下通過jQuery和JS AJAX請求運行Flash。 –
ashein
2012-02-21 12:19:59