這個專案的目的是為了讓 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~
沒有留言:
張貼留言