协作项目有一个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