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

ActionScript3 で JSONP を扱うライブラリ

AS3 で JSONP を扱えるライブラリがぱっと探した感じ無かったので作りました。

URLLoader とほとんど同じ感じに使えます。たとえばはてなブックマークJSONP なら

// ブラウザで表示しているドメインのセキュリティ許可
// swf のドメインが同じなら必要なし
JSONPLoader.allowCurrentDomain();

var loader:JSONPLoader = new JSONPLoader();
loader.addEventListener(Event.COMPLETE, function(e:Event):void {
    log(e.target.data); // target.data に JSON で渡ってくるデータが格納されている
});
loader.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent):void {
     // ここに来るのはタイムアウトの時のみ。デフォルト30秒。
     log('error!');
});
// loader.callbackQueryName = 'callback'; コールバックのクエリ名を指定。デフォルトは 'callback'

loader.load('http://b.hatena.ne.jp/entry/json/?url=' + encodeURIComponent('http://d.hatena.ne.jp/secondlife/'));

swf を呼び出す html には、swf の呼び出し元のドメインが違う場合、パラメータ allowScriptAccess を always に指定する必要があります。

<param name="allowScriptAccess" value="always" />

この AS3 コードを実行してみると

#<Object:{0:tech, 1:programming, 2:ruby, 3:ajax, 4:javascript, 5:ajax, 
6:#<Object:{tags:, timestamp:2007/07/17 23:03:06, comment:, user:konu2}>, 
7:#<Object:{0:hatena, 1:blog, 2:computer, user:hobby_hobby,
// 以下続く

な感じで AS3 のオブジェクトにマッピングされ*1受け取ることが出来ます。ExternalInterface#addCallback で指定したコールバック関数が、swf の呼び出し元が別ドメインの場合、Security#allowDomain を適切に設定しないと

uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].

というエラーが出て嵌った罠。allowScriptAccess だけじゃダメだったのに気づかなかった…(ドキュメントにちゃんと載ってる)。

*1:ExternalInterface で eval してるだけだけど