読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

JSONBrokerのActionScript版クライアントを書いた

RubyクラスをJSONでアクセスできるWebサービス化する」で作ったJSONBroker(任意のRubyクラスのAPIJSON-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] );
    }
  }
}