2012-03-18

AS-PHP-talk 簡介

AS-PHP-talk 放到 github 後, 不知不覺已經過了一年 =..=, 突然想來寫個介紹。

這個專案的目的是為了讓 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~

沒有留言:

FB 留言