Action Message Format (AMF)

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とします。

```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とします。

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

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

![スライド3.jpg](https://qiita-image-store.s3.amazonaws.com/0/3862/bcefaae0-e613-59e0-a493-330f8a53835e.jpeg)


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

> -services "services-config.xml"

![スライド4.jpg](https://qiita-image-store.s3.amazonaws.com/0/3862/7e1acac9-36b7-9cba-8bb5-06b3916e817a.jpeg)

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

```xml: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タグでサービスの呼び出し成功・失敗時に呼び出す関数を定義します。

```mxml: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の内容が中心です。