您好,欢迎访问一九零五行业门户网

as3与php交互兑现总结

as3与php交互实现总结
?
转自:http://blog.csdn.net/ahstudy/article/details/6996824
目前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文件内容:
? 北京
? 上海
上述代码结果:
北京,上海
?
第三种 无参数 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 ;
? echo ;
? echo 北京;
? echo 上海;
? echo ;
?>
?
第四种 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是值对,注意区别。
?
其它类似信息

推荐信息