這個專案的目的是為了讓 ActionScript 和 PHP 溝通有另一種較為簡單的選擇, 目前後端只有 PHP 的實作。 以往後端 ( 筆者較常使用 PHP ) 和 AS 溝通, 比較舊的方式是通過 XML, 比較多人用的是透過 AMF ( Flash remoting ), AS-PHP-talk 則是使用 JSON。
JSON 和 XML 相比的話, 同樣都是文字格式。XML 可以制訂的資料比較複雜; 然而, JSON 可以描述 Object、Array 和基本類型的資料 , 其實已經很夠用。
JSON 和 AMF 相比的話, AMF 體積應該會比較小, 但由於 AMF 是二元資料, 除錯相對於文字格式的 JSON 要來得麻煩。JSON 資料可以直接秀在網頁上, 有錯誤時也可以在網頁上就查覺。
前端和後端資料交換的程式, 最麻煩就是除錯。AS-PHP-talk的目的是, 可以在完全沒撰寫前端程式 ( Flash ) 之前, 利用簡單的網頁就達到後端 PHP 程式的除錯。後端的開發人員可以完全不用理會前端程式的開發進程; 前端的開發人員也可以透過簡單的後端 ( 送假資料 ) , 進行前端的開發。前、後端的程式可以很方便的切開來。
在 AS-PHP-talk 的專案裡, 已經包含了前後端的範例程式。為了方便和 Zend_AMF 接軌, 讓後端的寫法仿照 Zend_AMF 的寫法。先把 AsPhpTalk 目錄放到工作目錄內, 接下來依照底下的步驟:
<?php # 1. 引入 AsPhpTalk/Server.php require_once "AsPhpTalk/Server.php"; # 2. 建立 Asphptalk_Server 物件 $server $server = new Asphptalk_Server(FALSE); // No production status # 3. 加入允許呼叫的函式或類別 $server->addFunction( 'sayHello' ) ->addFunction( 'multi' ) ->setClass("examples_ExampleClass2") ->setClass("ExampleClass1"); # 4. 處理並丟出 JSON 格式的資料 echo $server->handle(); # 5. 以下為函式的定義 function sayHello( $who ) { return 'Hello~ ' . $who; } function multi( $a, $b, $c=1 ) { return 'multi: ' . ($a * $b * $c); }
後端的測試, 請使用 talk_tester.php 測試, 注意參數的輸入是使用 JSON 格式。若沒有參數, 請輸入一對中括號 [] 。(另外, 請在 talk_tester.php 加入 meta 標籤設定 charset 為 utf-8, 以避免中文亂碼 )
前端的寫法類似 Remoting 的寫法, 請先將 as-php-talk/as/bin/as-php-talk-v0.5.swc 複製到 lib 目錄。
package { import com.adobe.serialization.json.JSON; import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; // 1. 匯入 TalkConnection 和 TalkResponder 類別 import lin.shinder.asphptalk.TalkConnection; import lin.shinder.asphptalk.TalkResponder; public class AsTalkExample extends Sprite { public var info_txt:TextField; public function AsTalkExample() { init(); } private function init():void { info_txt = new TextField(); this.addChild(info_txt); info_txt.multiline = true; info_txt.width = stage.stageWidth; info_txt.height = stage.stageHeight; // 2. 建立 TalkConnection 物件, 參數請給 DisplayObject 以取得 stage var tc:TalkConnection = new TalkConnection(this); // 3. 建立處理的 TalkResponder 物件 var responder:TalkResponder = new TalkResponder(onResult, onFault); // 4. 連結 server (gateway), 自動取得協定及 domain name tc.connect('/talkserver/exampleServer1.php'); info_txt.appendText('Gateway: '+ tc.gatewayFullPath + '\n'); // 5. 呼叫服務函式, 並指定處理物件, 及給予參數 tc.call('sayHello', responder, "Shinder Lin"); } // 6. 呼叫失敗時的處理函式定義 private function onFault(event:Event):void { info_txt.appendText( event.toString() + '\n'); } // 7. 取得資料時的處理函式定義 private function onResult(result:*):void { info_txt.appendText( result.toString() + '\n'); } } }
Enjoy it~
沒有留言:
張貼留言