AS3从其他域加载XML

时间:2010-06-19 20:24:58

标签: actionscript-3 cross-domain

我正在尝试将维基百科中的xml文件加载到我的flash电影中。

loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, tweetLoaded);
loader.load(new URLRequest("http://en.wikipedia.org/w/api.php?action=query&rvprop=content&format=xml&pageids="+subNum));
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorFunction);

这在本地运行Flash文件时工作正常,但是当我上传到我的域时,它似乎不起作用。我在其他地方读过,跨域规则不仅适用于图像和其他媒体的XML文件。这是真的?如果没有,那么我可以从除了托管swf的域之外的域加载XML文件吗?

感谢

编辑:

好的,我真的很困惑,我的程序查询Bing API和媒体wiki API。 Bing api调用工作正常,我可以从中检索XML搜索结果。但维基百科电话不起作用(在线)。我已经尝试在维基百科调用中监听Security_Error但它没有触发。

有没有人有任何想法?失去一点。

2 个答案:

答案 0 :(得分:5)

非常感谢你的帮助。最后我使用了http://pipes.yahoo.com

我创建了一个管道,该管道接收了一个ID号,然后用相应的维基百科页面的标题吐出一个JSON对象。

你可以在这里使用http://pipes.yahoo.com/wikibyid

对于其他任何人这样做,您需要确保从yahoo api URL访问管道 http://pipes.yahooapis.com/ 因为这个域有crossdomain.xml文件。

答案 1 :(得分:3)

解决方法是使用某种服务器端语言设置代理,因此您的swf会从您的域加载数据。此代理将请求转发给真实主机,并将响应返回给swf。从闪存方面来看,这是透明的。

你可以让你的代理或多或少变得柔和,但它可以像(在php中)一样简单:

echo file_get_contents($_GET['target_url']);

这只是为了给您一个想法,您可能想要验证target_url参数。

让你的swf调用这个php脚本并传递target_url作为参数。像这样:

var url:String = "proxy.php";
var paramVal:String = encodeURIComponent("http://en.wikipedia.org/w/api.php?action=query&rvprop=content&format=xml&pageids="+subNum);
url += "?target_url=" + paramVal;
loader.load(new URLRequest(url));

请注意,对于php,这将需要允许fopen for urls(类似的权限可能是其他服务器端技术的必要条件)。另外,请记住这会影响您的服务器带宽消耗。

<强> PS

Bing之所以有效,是因为他们有一个跨域政策文件,允许从其他域访问swfs。

http://api.bing.net/crossdomain.xml

Wikipedia没有允许您从其他域访问的跨域策略文件,因此您无法直接从swf连接。