Zend_Amfを使っての通信
それでは実際にZend_Amfを使った例を見てみましょう。ここではFlashアプリ内のボタン[Send to Zend Amf]を押すとサーバへリクエストが渡り、そこから返ってきたメッセージをFlashアプリ右側のテキストエリアに表示するという、簡単なやりとりを見てみます(図3)。
Flash側のコードを理解する
まず、Flashアプリのソースコードから見ていきましょう。リスト3にFlashアプリのユーザーインターフェースの一部を示します。(2)のボタンはクリックされるとclick
属性に記述されているようにsend
関数を呼び出し、(1)に格納されたテキストを送信します。また、(3)にはid
がmessage
であるテキストエリアがあり、PHPから帰ってきたメッセージを表示するようになっています。
<?xml version="1.0"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> ... <!-- (1) 送信テキスト --> <mx:Text width="100%" color="blue" text="Zend Amf と Flex のテスト"/> <!-- (2) ボタン --> <mx:Button id="iconButton" label="Send to Zend Amf" paddingLeft="12" paddingRight="18" labelPlacement="right" color="#993300" click="send();"/> ... <!-- (3) テキストエリア --> <mx:TextArea id="message" text="" editable="false" height="100%" width="100%" color="#0000FF"/> ... </mx:Application>
リスト4は、Zend_Amfと実際にやりとりする部分のコードです。(1)にはリスト3の(2)から呼び出されるsend
関数が記述されています。(2)にはZend_Amfからの応答が返ってきた場合の処理が、(3)には通信に失敗した場合の処理が記述されています。
<?xml version="1.0"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <!-- Zend_Amfと実際にやりとりするAction Script --> <mx:Script> <![CDATA[ import flash.net.NetConnection; import flash.net.ObjectEncoding; import flash.net.Responder; import mx.controls.Alert; /* (1) AMF3形式でデータを送る */ private function send():void { //(1-1)結果に応じたコールバック関数を登録したオブジェクト var responder:Responder = new Responder(onSuccess, onFailure); //(1-2)Zend_Amfとの接続のためのオプジェクト var nc:NetConnection = new NetConnection(); //(1-3)Zend_AmfのURLを指定 nc.connect('http://localhost/index/amf'); //(1-4)AMF3 でエンコードするように指定 nc.objectEncoding = ObjectEncoding.AMF3; //(1-5)渡すデータを作成 var params:DataAS = new DataAS; params.data = texttosend.text; //(1-6)Zend_AmfにgetHelloStringをリクエスト nc.call('HelloWorld.getHelloString', responder, params); } /* (2) 成功時の処理 */ private function onSuccess(ret:*):void { if (typeof ret == 'string') { //テキストエリアに帰って来た文字列を追加 message.text = message.text + ret; } } /* (3) 通信に失敗した時の処理 */ private function onFailure(ret:*):void { Alert.show('通信に失敗'); } ]]> </mx:Script> ...
(1)の処理をもう少し詳しく見ていきましょう。ここでは最後の(1-6)にあるnc.callでZend_AmfにHelloWorld
サービスのgetHelloString
メソッドの処理をリクエストしていて、その前の部分はそのリクエストのための準備となります。
(1-1)では、nc.callの結果に応じた処理を行うコールバックを登録するためのオブジェクトを生成しています。nc.callの処理が成功した場合は(2)のonSuccess
を、失敗した場合には(3)onFailure
を呼び出すようにしています。
(1-2)ではZend_Amfに接続するためのオブジェクトを生成し、(1-3)で接続先のアドレスを指定しています。また、(1-4)ではリクエストの形式を指定しています。
(1-5)ではリクエストの際に送るデータを作成しています。ここではデータをDataAS
クラスのオブジェクトとして渡していますが、このようにオブジェクトをデータの受け渡しにはコツがあります。こちらについては、後からもう少し詳しく説明します。