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
もどる