Adobe FlexでJSON形式で結果を返すWebAPIを使う



Flexでデータのやり取りを行う場合、XML形式のデータを
使用することが多いかと思います。

しかし、通信量の観点から考えるとJSONの方が優れています。

・・・というのは、建前でFlexでJSON形式のデータが扱って
みたかっただけで、備忘録として手順を記載しておきます。


まず、FlexでJSON形式のデータを扱うために、
http://code.google.com/p/as3corelib/
ここから「corelib-.90.zip」をダウンロードします。

解凍して、以下のファイルをコピーします
\bin\corelib.swc  →  %flex_sdk%\frameworks\libs\corelib.swc
\src\com  →  %flex_sdk%\frameworks\source\com
※フォルダが無い場合は、新規作成

これで、JSONの開発環境は出来上がりです。


今回はWikipedia APIの結果をJSON形式で受け取り、Flexで表示してみます。
http://wikipedia.simpleapi.net/

このAPIは
http://wikipedia.simpleapi.net/api?output=json&keyword=[検索対象したいキーワード]
というリクエストを送信すれば、結果をJSONで返してくれます。


サンプルはこんな感じです。


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" backgroundColor="#FFFFFF" layout="absolute">

    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.rpc.events.ResultEvent;
            import com.adobe.serialization.json.JSON;
            import flash.display.Sprite;
            import flash.net.navigateToURL;
            import flash.net.URLRequest;
            import flash.net.URLVariables;
            import mx.controls.Alert;

            //JSON形式のデータをArrayCollectionに変換する
            private function onJSONLoad(event:ResultEvent):void
            {
                var rawData:String = String(event.result);
                var arr:Array = (JSON.decode(rawData) as Array);
                var dp:ArrayCollection = new ArrayCollection(arr);
                if((dp == null) || (dp.length == 0)) {
                    Alert.show("検索結果は0件です。");
                }
                grid.dataProvider = dp;

            }

            //引数で指定されたURLをブラウザで表示する
            public function NavigateToURL(url:String):void {
                var request:URLRequest = new URLRequest(url);
                try {
                    navigateToURL(request);
                }
                catch (e:Error) {
                    trace("navigate error")
                }
            }

            //検索実行
            private function findData():void {
                urlString = "http://wikipedia.simpleapi.net/api?output=json&keyword=" + encodeURI(src.text);
                service.send();
            }

            //グリッドをダブルクリックしたとき、対象のURLを開く
            private function DoDodoubleClick(event:MouseEvent):void {
                NavigateToURL(grid.dataProvider[grid.selectedIndex]["url"]);
            }

            //テキストボックスでエンターキーが入力されたとき、検索を実行する
            private function keyDownChecker(e:KeyboardEvent):void {
                if(e.keyCode == 13){
                    findData();
                }
            }
            
            [Bindable]
            private var urlString:String;
        ]]>
    </mx:Script>

    <mx:HTTPService id="service" resultFormat="text"
                    url="{urlString}"
                    result="onJSONLoad(event)"
                    showBusyCursor="true" />

    <mx:VBox right="10" left="10" top="10" bottom="10" height="100%" width="100%" backgroundColor="white" fontSize="12">
        <mx:HBox>
            <mx:TextInput id="src" text="" keyDown="keyDownChecker(event)" />

            <mx:Button label="検索" click="findData()" />
        </mx:HBox>
        <mx:DataGrid id="grid" height="100%" width="100%" doubleClickEnabled="true" doubleClick="DoDodoubleClick(event)" >
            <mx:columns>
                <mx:DataGridColumn headerText="title" dataField="title"/>
                <mx:DataGridColumn headerText="body" dataField="body"/>
                <mx:DataGridColumn headerText="url" dataField="url"/>
            </mx:columns>
        </mx:DataGrid>
    </mx:VBox>
</mx:Application>



出来上がったswfをフラッシュプレーヤーで実行すると・・・

[RPC Fault faultString="URL へのアクセス中にセキュリティエラーが発生しました"
faultCode="Channel.Security.Error" faultDetail="送信先 : DefaultHTTP"]



というエラーが発生すると思います。


これを回避するためには、Windowsの場合
C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust
※FlashPlayerTrustフォルダは作成します。
以下に.cfgファイルを作成。

例)
debug.cfg
(名前は何でもよいです)

内容
# ローカルアクセスを許可したいフォルダを記述
# これ以下のフォルダには無制限にアクセス可能。
C:\flex_src

これで、C:\flex_src以下のローカルファイルに
アクセス可能となります。


再度実行してみると、こんな感じで結果が表示されます。




【参考URL】
http://www.mikechambers.com/blog/2006/03/28/tutorial-using-json-with-flex-2-and-actionscript-3
http://www.adobe.com/jp/devnet/flashplayer/articles/fp8_security.html


もどる