読者です 読者をやめる 読者になる 読者になる

Catalyst で簡単 Flash Remoting サーバーサイド開発

perl のイベントで空気を読まず Flash についての発表をしたり、Ajax のテーマの原稿で空気を読まず Flash について書いたりしている村瀬です。こんにちは。

先日 adobe が AMF (Action Message Format) の仕様を公開してくれたので、それではと perl で AMF パーサーを書いてみました。

Data::AMF

この中の Data::AMF が AMF のデータ部分のみをパースするモジュール。Data::AMF::Packet が Flash Remoting などでつかわれる AMF パケットをパースするモジュールとなっています。

ということで、Data::AMF::Packet を使用すれば Flash Remoting のサーバーサイドを開発することはできるのですが、AMF パケットを素で扱うと若干面倒な実装をする必要があります。そこで、あわせて Catalyst 用の Flash Remoting 専用コントローラも開発しました。

Catalyst::Controller::FlashRemoting

まず、Catalyst::Controller のかわりに Catalyst::Controller::FlashRemoting を継承します。

package MyApp::Controller::Root;
use strict;
use warnings;
use base 'Catalyst::Controller::FlashRemoting';

次にゲートウェイとなるアクションに :AMFGateway という属性をつけます。

この場合 /gateway というURLをゲートウェイにしたいとすると、

sub gateway :Local :AMFGateway { }

というアクションを作成します。:AMFGateway という属性をつける以外は Catalyst の通常のアクションと変わりません。

このゲートウェイ用のアクションは AMF リクエストをパースし、それをもとにリクエストにあったメソッドを自動的に呼び出します。そしてそのメソッドの返り値をまたAMFにシリアライズし、レスポンスを作ります。

メソッドを作るには :AMFMethod という属性をつけた関数をゲートウェイと同じ名前空間につくります。

sub echo :AMFGateway('echo') {
    my ($self, $c, $arg) = @_;

    return $arg
}

:AMFGateway という属性に引数で渡した文字列 (ここではAMFGateway('echo')としてますのでechoがその文字列になります) が AMF のメソッド名になります。 ここは省略可能で、省略した場合はそのメソッドの関数名自体が使用されます。

すなわち上の例は

sub echo :AMFGateway {
    my ($self, $c, $arg) = @_;

    return $arg
}

と書くこともできます。

今作ったコントローラの全体像を貼ってみます。

package MyApp::Controller::Root;
use strict;
use warnings;
use base 'Catalyst::Controller::FlashRemoting';

sub gateway :Local :AMFGateway { }

sub echo :AMFMethod {
    my ($self, $c, $args) = @_;
    return $args;
}

1;

これだけのコードで、Flash Remoting サーバーの出来上がりです。echo は受けたリクエストをそのままオウム返しするメソッドです。

簡単ですね!

Catalyst を普段使っている人であれば一瞬で Flash Remoting のサーバーを作ることができるでしょう。皆さんもRemotingサーバーが必要なときはぜひ使ってみてくださいね!

カヤックでは Flash のバッドノウハウにたいして造詣の深い方や AMF のみならず RTMP にも詳しい方を募集しています!