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 してるだけだけど