JSONBrokerのActionScript版クライアントを書いた
「RubyクラスをJSONでアクセスできるWebサービス化する」で作ったJSONBroker(任意のRubyクラスのAPIをJSON-RPCライクなプロトコルでアクセスできるWebサービスとして公開するための簡易ユーテイリティ)のActionScript版クライアントを書きました。前に作ったJavaScript版クライアントと似たような機能を提供します。
サンプル
以下はJavaScript版クライアントで作成したサンプルのサービスに接続するサンプルです。「StubFactory.create()」でスタブを生成し、APIを呼び出せばOK。
- スタブのメソッド名がそのまま呼び出すサービスのメソッド名となります。
- 最後の2つの引数が、成功時のコールバック関数とコールバック関数になります。それ以外はサービスAPIの引数としてサーバーに送付されます。
- 実行結果はデシリアライズされてコールバック関数に通知されます。
// スタブを作る var stub:* = StubFactory.create( "../test.cgi" ); // API呼び出し // 最後の2引数でコールバック関数を指定する。 stub.analysis( {name:"mii", age:1}, function( result:* ):void { stdout.text += result["name"]+"/"+result["type"]+"/"+result["age"]+"\n"; },function( error:* ):void { log(error); } );
実装
StubFactoryの実装は以下のとおり。Proxyを利用しています。
package { /** * スタブファクトリ */ public class StubFactory { /** * スタブを生成する。 */ public static function create( endPoint:String ):* { return new Stub( endPoint ); } } } import flash.errors.*; import flash.events.*; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.net.URLVariables; import flash.utils.Proxy; import flash.utils.flash_proxy; import com.adobe.serialization.json.JSON; // スタブ dynamic class Stub extends Proxy { private var endPoint:String; function Stub( endPoint:String ) { this.endPoint = endPoint; } flash_proxy override function callProperty(name:*, ...rest):* { var fail:Function = rest.pop(); var success:Function = rest.pop(); // リクエストを生成 var request:URLRequest = new URLRequest(); request.url = endPoint; var data:String = JSON.encode({ "method":name.toString(), "params":rest }); var variable:URLVariables = new URLVariables(); variable.request = data; request.data = variable; // ローダーを生成し、イベントハンドラを設定 var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, function( ev:Event ):void { var result:Object = JSON.decode( ev.target.data)[0]; if ( result["error"] ) { fail.apply(null, [result["error"]] ); } else { success.apply(null, [result["result"]] ); } }); loader.addEventListener(IOErrorEvent.IO_ERROR, function( ev:Event ):void { fail.apply(null, [ev] ); }); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function( ev:Event ):void { fail.apply(null, [ev] ); }); try { loader.load(request); } catch (error:*) { fail.apply(null, [error] ); } } }