Flash中发送http请求的限制和解决方法

在Flash中导入外部数据,是flash编程常用的方法,利用这种方法结合后台程序可以完成很多强大的功能,但是出于安全上的考虑,这中间也有一些限制。
现在越来越多服务都开放了api供其他程序调用,但是由于这些限制的存在,往往使得flash开发者非常沮丧。。。

最大的限制是禁止跨域读取,这一点和Ajax类似,在默认情况下,域名A上的swf程序,是无法读取域名B上的文件或后台程序的。但和Ajax不同的是,flash并不是绝对禁止,如果要让域名A的程序访问域名B的内容,只要在域名B上放置一个xml的文件,通常命名为crossdomain.xml,在文件中声明允许域名A的访问,域名A上的flash程序访问域名B之前,调用System.security.loadPolicyFile()读取这个文件(细节请参考flash帮助),之后就可以访问了。
另外,在本地硬盘上运行的swf程序,只要在全局安全性设置面板中设置永远允许就可以访问任意网站的内容。
还有一种方法就是利用后台程序作为proxy,域名A的swf先调用域名A上的后台proxy程序,后台proxy再调用域名B的程序,最后把结果返回给swf。

其次,AS2中的LoadVars类可以添加自定义http头,这个功能很好,但是遗憾的是这个设置只对POST方法起作用,GET方法无效。as2的文档中关于addRequestHeader的部分提到了这个限制。AS3对http请求的控制更加细致,而且文档中没有提到只能发送POST的限制,但是经过试验发现这个限制仍然存在。
为什么自定义http头很重要呢?
因为在http头中加入验证信息是许多网上服务常用的做法,例如Google api的验证。有些验证要求GET方法,有些要求POST方法。GET方法不能添加自定义http头就使得flash无法调用许多需要GET方法做用户认证的服务。
但是这个限制似乎并不是绝对,我偶然发现有一个方法可以发送带自定义http头的GET请求,可能是flash的一个漏洞,但是这个方法只能发送,不能读取,所以实际用处也不大。
实现的步骤是:

  1. 创建LoadVars对象。
  2. 用LoadVars.addRequestHeader()构造自定义http头。
  3. 确保LoadVars对象中不要加入任何变量。
  4. 用LoadVars.send发送,method选择"POST",窗口名称随意,建议用"_blank"让结果在新窗口中出现。虽然使用post方法,但是由于没有数据,所以实际发送的还是一个GET方法。而http头却被正确加入了。

同样的步骤如果用sendAndLoad,method用"POST",结果仍然是不能加入http头。所以目前看来只能做到这样了。用是勉强可以用的,但是由于不能读取结果,只能麻烦用户把出现的结果copy回来给flash。。。