首页 > 编程语言 >as3与php交互实现总结

as3与php交互实现总结

时间:2023-01-05 16:38:16浏览次数:55  
标签:as3 URLLoader URLRequest 交互 loader new php data


 

目前flash在各方个面的应用越来越广,而flash也不单只是注重自身绚丽的效果,也需要和外界程序交换数据,以实现更强大的功能,随着as3的到 来,flash和外部交互的方式也越来越简便和合理化。今天就在这里谈谈as3和后台数据的交互(这里选择as3+php架构,其他配置同理)。

在as3里,原来的loadVars方法已经被废弃,而改用一系列的类来实现与后台数据的交互,这些类是:URLLoader,URLLoaderDataFormat,URLStream,URLVariables。
URLLoader 类和原来的loadVars类似,是加载文本,2进制数据,xml,URL数据等信息的有力工具。URLLoader接受一个URLRequest 作为构造的参数,使用load方法来加载数据。URLLoder也可以进行监听,这点也loadVars不同,一个简单的示例如下:

//actionscript code// 
//声明一个URLLoader
var loader:URLLoader = new URLLoader();
//监听数载加载完成事件
loader.addEventListener(Event.COMPLETE,loaded);
//事件相应函数
function loaded(e:Event){
trace(loader.data);
// output : this data is from php!
}
//加载test.php
loader.load(new URLRequest("test.php"));
// test.php code/
//声明一个变量并赋给一个字符串
$data ='this data is form php!';
//输出这个变量给flash
echo $data;
?>


从上面的示例可以看出,as3和后台交互是多么简单,但这只是单项的交互,如果要flash向后台发送数据并传回数据该如何去做呢?这个时候你可能会把代码该成这样:

//actionscript code 
var loader:URLLoader = new URLLoader();
loader.data={message:"hello im flash!"};
loader.addEventListener(Event.COMPLETE,loaded);
function loaded(e:Event){
trace(loader.data);
// output : this is flash say:
}
loader.load(new URLRequest("test.php"));
//test.php code//
$flashData = $_POST['message'];
echo "this is flash say:$flashData";
?>


看看输出的代码,你得到了什么?是的,信息并没有传输到php,你还是在用loadVars的方式试图传送数据,但as3里已经不是这样了, URLLoader的data只有在数据被下载完时才会被初始化,在数据没有加载完成时,它是等于null的,也就是说,它只包含接受到的数据,而不管要 发送的数据,那么,as3里如何向后台发送数据呢?使用URLVariables。URLVariables允许你在flash和后台程序间传输变量, as3里已经把发送和接受数据分离,再也不像as2的loadVars那样,一个类通吃所有了,那么这个URLVariables如何送要发送的数据呢?
你可能找遍了URLLoader的文档也没有发现与它相关的东西,是的URLLoader并不和URLVariables有关联,而是 URLRequest在使用它,URLRequest包含整个http请求的所有信息,所以我们要发送的数据要放在这里,URLRequest有一个 data属性他接受一个object类型的参数,这就是我们要发送的数据。同时你可能还注意到了,URLRequest也管理用什么样的方式来发送 http请求,它的method属性接受一个字符参数,post或者是get。好了,现在我们来看看它们是怎么工作的:

//actionscript code 
var loader:URLLoader = new URLLoader();
//声明一个URLRequest
var ​​url:URLRequest​​ = new URLRequest("test.php");
//设置传输方式为POST
url.method = URLRequestMethod.POST;
//声明一个URLVariables
var values:URLVariables = new URLVariables();
//设置要传输的信息
values.message="hello im flash!";
url.data = values;
loader.addEventListener(Event.COMPLETE,loaded);
function loaded(e:Event){
trace(loader.data);
// output : this is flash say:hello im flash!
}
loader.load(url);
//test.php code//
$flashData = $_POST['message'];
echo "this is flash say:$flashData";
?>


怎么样,是不是也很方便的实现了as3和后台的数据传输?恩,现在我们的程序可以双向交互数据了,但这只是一些简单的数据,如果你要传输带有结构的 数据,(熟悉as2的人都知道loadVars可以自动解析下载数据的结构),让我们先按loadVars的方式来尝试下,看看URLLoader是不是 能自动的解析下载的数据。

//actionscript code 
var loader:URLLoader = new URLLoader();
//声明一个URLRequest
var ​​url:URLRequest​​ = new URLRequest("test.php");
//设置传输方式为POST
url.method = URLRequestMethod.POST;
//声明一个URLVariables
var values:URLVariables = new URLVariables();
//设置要传输的信息
values.message="hello im flash!";
url.data = values;
loader.addEventListener(Event.COMPLETE,loaded);
function loaded(e:Event){
trace(loader.data);
//outPut: phpMessage=im php message!&flashMessage=hello im flash!
trace(loader.data.phpMessage);
// thorw Error;
trace(loader.data.flashMessage);
// thorw Error;
}
loader.load(url);
//test.php code//
$flashData = $_POST['message'];
$phpMessage = 'im php message!';
echo "phpMessage=$phpMessage&flashMessage=$flashData";
?>


可以看到,数据被完全下载下来了,但是却没有被解析,还抛出了异常,那么是不是URLLoader就不能自动解析数据了呢?不是,相反 URLLoader提供了多种数据解析方式供你选择。这些数据解析方式都在URLLoaderDataFormat里,他们是:BINARY-以2进制的 方式解析 TEXT-以文本的方式解析 VARIABLES-以变量-值配对的方式解析。URLLoader的dataFormat属性提供了对解析方式的选择,好,我们再来修改下程序使它变的 更完美些:

//actionscript code 
var loader:URLLoader = new URLLoader();
//声明一个URLRequest
var ​​url:URLRequest​​ = new URLRequest("test.php");
//设置传输方式为POST
url.method = URLRequestMethod.POST;
//声明一个URLVariables
var values:URLVariables = new URLVariables();
//设置要传输的信息
values.message="hello im flash!";
url.data = values;
//设置以变量-值配对的方式解析数据
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE,loaded);
function loaded(e:Event){
trace(loader.data);
//outPut: phpMessage=im php message!&flashMessage=hello im flash!
trace(loader.data.phpMessage);
// im php message!
trace(loader.data.flashMessage);
// hello im flash!
}
loader.load(url);
//test.php code//
$flashData = $_POST['message'];
$phpMessage = 'im php message!';
echo "phpMessage=$phpMessage&flashMessage=$flashData";
?>


以上这些就是as3里和后台交互的基础内容,现在你可以在as3里创建这样的交互,获取动态数据来丰富你的程序,在你开始自己动手实验之前,还有一些东西值得注意:
1,记得捕获和处理异常(上述的例子里都是假定在完美的测试环境下运行,所以没有加上异常捕获和处理的代码,但现实中你可能会遇到各种各样的情况)URLLoader可能引发好几种异常情况(详细请参见说明文档)
你应该通过监听ioError和securityError事件,或者通过try-catch来处理他们,即使你确信不会发生这样的问题。
2,文件的编码,这是个常见的问题,经常很多数据变成了乱码,或者解析出错,都是因为编码的问题,我的做法是确保发送的数据和后台传回的数据都是UTF-8格式(因为flash默认编码为utf-8)
最后希望这篇文章能对你有所帮助,也欢迎你留言讨论相关的问题。

 

第一种 不传参 直接读取PHP文件

btn.addEventListener(MouseEvent.CLICK,loadTxt);
function loadTxt(evt:MouseEvent):void
{
var urlLoader:URLLoader=new URLLoader();
urlLoader.dataFormat=URLLoaderDataFormat.VARIABLES;
urlLoader.load(new URLRequest("​​http://localhost/as3/url2.php​​"));
urlLoader.addEventListener(Event.COMPLETE,finish);
}
function finish(evt:Event):void
{
var mydata:URLVariables=URLVariables((evt.currentTarget as URLLoader).data);
mytxt.text="国家是:"+mydata.state+"\n";
mytxt.text+="var1是:"+mydata.var1;
}
php端代码:
<?
$state="中华人民共和国";
$var1="我恨你";
echo "state=".$state."&var1=".$var1;
?>

第二种 无参数  读取XML文件

 

btn.addEventListener(MouseEvent.CLICK,loadTxt);
function loadTxt(evt:MouseEvent):void
{
var urlLoader:URLLoader=new URLLoader();
urlLoader.load(new URLRequest("data.xml"));
urlLoader.addEventListener(Event.COMPLETE,finish);
}
function finish(evt:Event):void
{
var mydatas:XML=XML((evt.currentTarget as URLLoader).data);
mytxt.text=mydatas.c1.toString()+","+mydatas.c2.toString();
}


xml文件内容:

<?xml version="1.0" encoding="utf-8"?>
<cities>
<c1>北京</c1>
<c2>上海</c2>
</cities>


上述代码结果:
北京,上海

 

第三种 无参数 PHP生成XML文件

 

btn.addEventListener(MouseEvent.CLICK,loadTxt);
function loadTxt(evt:MouseEvent):void
{
var urlLoader:URLLoader=new URLLoader();
urlLoader.load(new URLRequest("​​http://localhost/as3/xml.php​​"));
urlLoader.addEventListener(Event.COMPLETE,finish);
}
function finish(evt:Event):void
{
var mydatas:XML=XML((evt.currentTarget as URLLoader).data);
mytxt.text=mydatas.c1.toString()+","+mydatas.c2.toString();
}
php端:
<?
//你可以使用php操作xml的函数
//这里为了简单起见只是echo出来
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
echo "<cities>";
echo "<c1>北京</c1>";
echo "<c2>上海</c2>";
echo "</cities>";
?>

第四种 GET 传参

System.useCodePage=true;
btn.addEventListener(MouseEvent.CLICK,loadTxt);
function loadTxt(evt:MouseEvent):void
{
var urlLoader:URLLoader=new URLLoader();
var request:URLRequest=new URLRequest();
request.url="​​​http://www.baidu.com/s​​​";
request.method=URLRequestMethod.GET;
request.data="wd=flash";
urlLoader.load(request);
urlLoader.addEventListener(Event.COMPLETE,finish);
}
function finish(evt:Event):void
{
mytxt.text=(evt.currentTarget as URLLoader).data;
}第五种 POST 传参
System.useCodePage=true;
btn.addEventListener(MouseEvent.CLICK,loadTxt);
function loadTxt(evt:MouseEvent):void
{
var urlLoader:URLLoader=new URLLoader();
var request:URLRequest=new URLRequest();
var vars:URLVariables=new URLVariables();
vars.wd="flash";
request.url="​​​http://www.baidu.com/s​​​";
request.method=URLRequestMethod.GET;
request.data=vars;
urlLoader.load(request);
urlLoader.addEventListener(Event.COMPLETE,finish);
}
function finish(evt:Event):void
{
mytxt.text=(evt.currentTarget as URLLoader).data;
}


这里data是URLVariables是值对,注意区别。

 

标签:as3,URLLoader,URLRequest,交互,loader,new,php,data
From: https://blog.51cto.com/kenkao/5991413

相关文章

  • PHP异步调用实现方式
    PHP异步调用实现方式浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接。......
  • VC.dll相关及其C#交互
    方法步骤:1.新建工程:  如果需要MFC的支持,可以选择MFCAppWizard(dll)工程类型,如果不需要,可以选择Win32(dll).2.编写内部代码:  该部分过程与建立一般的exe文件大同小异,在此......
  • ThinkPHP多语言模块文件包含RCE复现详细教程
    漏洞描述:ThinkPHP在开启多语言功能的情况下存在文件包含漏洞,攻击者可以通过get、header、cookie等位置传入参数,实现目录穿越+文件包含,通过pearcmd文件包含这个trick即可实......
  • AS:Flash AS3中获取浏览器信息及URL相关参数(并非swf url地址)
    好久没来这里了,最近发现网络上对此类信息的封装少的可怜,没有一个是比较完整的,今天又是周未,不敲点代码手痒痒的,^_^,所以本人手贱借此时发布一篇是关于 AS3中获取浏览器信息......
  • PHP生成签名方法
    将参数按照顺序组合merchant=201905240200152433&orderAmount=10&orderId=bbb1561367503&outcome=yes&payMethod=2&payType=21&signType=MD5&version=1.0拼接商户密钥m......
  • 查找php-fpm
    [root@VM-4-6-centos/]#find/-namephp-fpm/opt/remi/php74/root/usr/sbin/php-fpm/etc/opt/remi/php74/sysconfig/php-fpm/var/opt/remi/php74/log/php-fpm/var/opt/r......
  • LNMP架构环境之PHP+Mariadb环境项目:部署博客wordpress项目
    1)配置nginx博客虚拟主机cat>/etc/nginx/conf.d/02_blog.etiantian.org.conf<server{server_nameblog.etiantian.org;listen80;root/data/blog;indexindex.php......
  • php发送钉钉消息,模板例子
    <?php#key与secret私钥$appkey="ding6prlu53np9e6ly0vv2";$appsecret="KW9_HiBHyLs5YYgb0zfHd3uAvtrbbMZy5bv5eEsQzzctA9nbZjk6KuEMudJFWllVeI";//请求token$u......
  • php
    1.php代码格式<?php......?>2.;代表一行语句结束  {}代表一段语句结束3.echo可输出一行或多个字符串,用逗号隔开  print只允许输出一个字符串echo1......
  • 利用phpmyadmin拿Webshell
    利用phpmyadmin拿Webshell当拿到phpmyadmin的用户名密码后,如何拿到webshell呢,步骤如下:确认可以通过phpmyadmin写入文件,执行SQL语句:showglobalvariableslike"secur......