2012-02-13 107 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"); 

这为我们工作。谢谢