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是值對,注意區別。
?