以为在as3里面和后台通讯也是那么简单的事情,但实践告诉你,还是要遇到很多麻烦,例如不像as2里面loadVars方法已经被废弃,而改用一系列的类来实现与后台数据的交互,这些类是:URLLoader,URLLoaderDataFormat,URLStream,URLVariables。
在使用URLLoaderDataFormat.VARIABLES时报以下错误:
Error: Error #2101: 传递给 URLVariables.decode() 的字符串必须是包含名称/值对的 URL 编码的查询字符串。
at Error$/throwError()
at flash.net::URLVariables/decode()
at flash.net::URLVariables$iinit()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()
出现些错误其实在于php里的第一行echo输出的信息中是否包含了url参数方式的;
以下的方式是正确的:
<?php
$flashData = $_POST['message'];
$phpMessage = 'im php message!';
echo "phpMessage=$phpMessage&flashMessage=$flashData";
?>
或
<?php
$flashData = $_POST['message'];
$phpMessage = 'im php message!';
echo "phpMessage=$phpMessage&flashMessage=$flashData";
echo "其他信息";
?>
以下方式就会报错:
<?php
$flashData = $_POST['message'];
$phpMessage = 'im php message!';
echo "sfsdfghfghfghfghgfhsf"; //不是url参数形式即不是 变量名=值 然后用 & 连接的格式;
?>
或
<?php
$flashData = $_POST['message'];
$phpMessage = 'im php message!';
echo "klsdfjlsdkfjlksdjflkjsdf"; //这是第一个echo, flash找不到匹配的 url参数形式的字符串;
echo "phpMessage=$phpMessage&flashMessage=$flashData";
?>
这个echo就需要写的很规范了,不能像as2时代乱来了。不过一般时候,还是可以用2进制来监控,只要加载完毕就OK。
下面是一个例子:
//要想成功的解析php文件 必须要有apache文件 也就是说 在测试flash与php通信时一定要有服务器(php用的是apache支撑)
// 一般的 服务端的语言要想被flash端引用 都要打印出来
// 在使用URLLoader时 php端一定会返回一个量 也就是说 php(其他服务端一样)一定要(至少)打印一个量 php 里是echo 或者print asp.net 是Response.WriteLine
// 也就是说只要有一个请求 就一定会有一个返回(用URLLoader时) 用NavigateToURL没有返回
var phpFile:String = "http://localhost/sendData.php";
function callServer(e:MouseEvent):void
{
var Vdata:URLVariables= new URLVariables();
Vdata.name="胡军";
Vdata.age=21;
var urlRequest:URLRequest = new URLRequest(phpFile);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, serverResponse);
urlRequest.data=Vdata;
urlRequest.method=URLRequestMethod.POST;
//loader.dataFormat=URLLoaderDataFormat.VARIABLES // 这句只是传输的方式
loader.load(urlRequest);
//flash.net.navigateToURL(urlRequest);
}
function serverResponse(e:Event):void
{
var loader:URLLoader = URLLoader(e.target);
var variables:URLVariables = new URLVariables(loader.data);
trace("OK");
//timeTxt.text = variables.returnValue;
//trace("来自php的变量returnValue:"+variables.returnValue);
// trace (variables.returnValue is String );//输出为 true
//trace(variables.username);
//trace(variables.id);
trace(variables.rename);// 输出 : 胡军
}
callBtn.addEventListener(MouseEvent.CLICK, callServer);
php端:
<?php
$name=$_POST["name"];
$age=$_POST["age"];
$postData="rename=$name"."&reage=$age";
echo $postData ;
?>