FlexとPythonでPyAMFを使ってAMF通信
前回の記事に引き続いて、今回はPythonを使ってFlexとAMF通信をしてみたいと思います。
PyAMFというモジュールを使って、AMF通信してみたいと思います。
PyAMF
- 下記のサイトより「PyAMF-X.X.X.zip」をダウンロード
PyAMF【http://docs.pyamf.org/dev/community/download.html】
- 任意の場所に解凍
$ unzip PyAMF-X.X.X.zip $ cd PyAMF-X.X.X
- インストール
$ python setup.py install
Python
- 下記のサイトより、「server.py」をダウンロード
http://docs.pyamf.org/dev/tutorials/general/helloworld/index.html
- server.pyについて
server.pyに下記のソースを追加
class Service: def returnName(name): return name + 'さん、こんにちわ' services = { 'returnNameService': Service.returnName, }
が今回Flexから呼び出されるサービスである
また、日本語も扱えるようにファイルの先頭に
# -*- coding: utf-8 -*-
を追記する
- server.pyの起動
$ python server.py Running Hello World AMF gateway on http://localhost:8000 # これで起動状態になりました
Flex
前回のFlexのコードとほぼ同じで、違うのは、connect部分とcall部分である
connection.connect("http://localhost:8000/")
と
connection.call("returnNameService", responder, nameText.text);
の部分である。
完全なソースは、下記に記します。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*"> <mx:Script> <![CDATA[ import mx.controls.Alert; import flash.net.*; // データ送信 private function doRequest():void{ // レスポンダーを作成 var responder:Responder = new Responder(onSuccess, onFault); // コネクションの作成 var connection:NetConnection = new NetConnection(); // コネクト connection.connect("http://localhost:8000/"); connection.objectEncoding = ObjectEncoding.AMF3; // ServiceクラスのreturnNameメソッドを呼び出す connection.call("returnNameService", responder, nameText.text); } // データ取得成功 private function onSuccess(e:*):void{ // 返却値をAlertで表示 Alert.show(e.toString()); } // データ取得失敗 private function onFault(e:*):void{ Alert.show("通信失敗"); } ]]> </mx:Script> <mx:TextInput x="10" y="36" id="nameText" /> <mx:Button label="Submit" id="idTest" click="doRequest()" x="10" y="66"/> <mx:Label x="10" y="10" text="name" color="#FFFFFF"/> </mx:Application>
PHPではクラス名+メソッド名でFlexからPHPのメソッドを呼んだが、
PyAMFでは任意のサービス名が指定できるため、クラス名+メソッド名のような指定はいらないらしい。
(この部分でかなり、ハマりました。。)