PHP
ActionScript3

Action Message Format (AMF)

More than 1 year has passed since last update.

Action Message Format(AMF)とは、Flash のデータ構造を直列化 (シリアライズ) する時に使用されるバイナリ形式のフォーマットです。
今回は、AMFの導入から使用例までを紹介します。

PHP用フレームワークであるZend FrameworkにはZend AMFというサブパッケージがあり、これを用いるとAdobe Flash Playerからサーバーが受け取ったリクエストを、オブジェクトやクラスメソッド、そして任意のコールバックにマッピングすることができます。

Zend FrameworkのダウンロードページからZend AMFと必要なライブラリだけをまとめたパッケージをダウンロードします。

ダウンロードしたZend AMFは、ウェブルート外に設置します。

AMFサーバは、RPCスタイルのサーバで、Adobe Flash PlayerからのAMFプロトコルによるリクエストを処理します。
AMFサーバを作成するためのPHPのコードは次のようになります。

Flexから呼び出されるプログラムで、ウェブルート下に設置します。
ファイル名をserver.phpとします。

server.php
<?php
  require_once('Zend/Amf/Server.php');
  require_once('HelloWorld.php');

  $server = new Zend_Amf_Server(); // 初期化
  $server -> setClass('HelloWorld');

  $response = $server -> handle(); // リクエスト処理

  echo $response;
?>

HelloWorldクラスからhelloメソッドが呼び出されます。
これはウェブルート外に設置します。ここではファイル名をHelloWorld.phpとします。

HelloWorld.php
<?php
class HelloWorld {
 /**
  * @return string
  */
 public function hello() {
  return 'Hello';
 }
}
?>

Flexからサーバに接続するためにservices-config.xmlでサービスを定義します。
はじめにrpc.swcファイルがプロジェクトに追加されていることを確認します。

スライド3.jpg

次にFlexコンパイラを選択して、以下の文を追加します。

-services "services-config.xml"

スライド4.jpg

Flexプロジェクトのsrcフォルダに、services-config.xmlを作成します。
endpointのuriにserver.phpのURLを記述します。

services-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
    <services>
        <service id="zend-service"
            class="flex.messaging.services.RemotingService"
            messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="zend">
                <channels>
                    <channel ref="zend-endpoint"/>
                </channels>
                <properties>
                    <source>*</source>
                </properties>
            </destination>
        </service>
    </services>
    <channels>
        <channel-definition id="zend-endpoint"
            class="mx.messaging.channels.AMFChannel">
            <endpoint uri="http://example.com/server.php"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>
</services-config>

これでサーバサイドの準備は完了です。
サーバに接続するためのMXMLは次のようになります。
RemoteObjectタグでサービスの呼び出し成功・失敗時に呼び出す関数を定義します。

sample.mxml
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:Script>
  <![[CDATA[
   import mx.rpc.events.ResultEvent;
   import mx.rpc.events.FaultEvent;

   /**
    * サービスを呼び出します。
    */
   private function init():void{
    remote.hello();
    //remote.hello("World"); 引数ありの場合
   }

   /**
    * サービス呼び出しが失敗した場合に送出されます。
    */
   private function remoteFaultHandler(event:FaultEvent):void{
    trace(event);
   }

   /**
    * サービス呼び出しが成功した場合に送出されます。
    */
   private function remoteResultHandler(event:ResultEvent):void{
    trace(event);
    trace(String(event.result));
   }
  ]]>
 </mx:Script>
 <mx:RemoteObject id="remote" source="HelloWorld"
    fault="remoteFaultHandler(event)"
    showBusyCursor="true"
    destination="zend">
   <mx:method name="hello" result="remoteResultHandler(event)" />
 </mx:RemoteObject>
</mx:Application>

この記事は、以前ブログで公開していた記事、内容を再編集したものです。
ActionScript 1.0/2.0/3.0とFlex 3の内容が中心です。