外部APIとの接続。
今回は「ブラウザで始めるActionScript」に乗っている外部APIとの接続を勉強します。
今まで勉強してきたXMLが必要となります。
まずはXMLの読み込みからです。
[cc lang="actionscript"]
public class Main extends Sprite {
public function Main() {
//検索結果のロード
var myURLLoader:URLLoader = new URLLoader();
// 読み込みが完了したら、onCompleteXML関数を呼び出す。
myURLLoader.addEventListener(Event.COMPLETE, onCompleteXML);
//どのデータを読み込むかを指定
var xmlURL:String = "http://photos.googleapis.com/data/feed/base/all?alt=rss&kind=photo&q=waterdrop&imglic=commercial&max-results=3&imgmax=288";
//crossdomain.xml(クロスドメインポリシーファイル)の位置を指定
Security.loadPolicyFile("http://photos.googleapis.com/data/crossdomain.xml");
// 指定されたXMLデータを読み込む。
myURLLoader.load(new URLRequest(xmlURL));
}
[/cc]
この読み込みでややこしいのは、クロスドメインについてです。
同じURLからだと問題はないのですが、別のドメインから呼び出す際にはcrossdomain.xmlを使わないといけません。
下記の部分で、アクセスできるかどうかを確認しています。
[cc lang="actionscript"]
Security.loadPolicyFile("http://photos.googleapis.com/data/crossdomain.xml");
// 今回の例では"http://photos.googleapis.com/data/crossdomain.xml"で読み込みができるかどうかを管理しています。
[/cc]
"http://photos.googleapis.com/data/crossdomain.xml"には具体的には大体このように書かれています。
[cc lang="xml"]
//すべてのドメインからアクセスを許可しますと記載されている。
[/cc]
[*]と記載があるので、すべてのドメインからアクセスできます。
もし
例外として、crossdomain.xmlがドキュメントルート(googleapis.com/ ここ )にありアクセス許可を与えている場合は、Security.loadPolicyFileが不要になります。今回の場合は
XMLの解析
XMLクラスを使って、読み込んだデータを解析します。
[cc lang="actionscript"]
private function onCompleteXML(e:Event):void {
//取得したデータをXML型にする。
var myXML:XML = new XML(e.currentTarget.data); // xmlURLで読み込んだデータを「e.currentTarget.data」で表している。
//背景のグレーの文字。XMLの文字列を流し込んでいる。
var tf:TextField = new TextField();
tf.text = myXML;
tf.textColor = 0xCCCCCC;
tf.wordWrap = true;
tf.width = tf.height = 465;
addChild(tf);
//XMLを解析
var titleStr:String = myXML.channel.item[0].title; //
var linkURL:String = myXML.channel.item[0].link;
//namespaceを設定
default xml namespace = new Namespace("http://search.yahoo.com/mrss/");
var creditStr:String = myXML.channel.item[0].group.credit;
//@はアトリビュート。contentの中にはurl,type,heightなどが分かれているのでそのどれを使うかを@で指定する。
var imgURL:String = myXML.channel.item[0].group.content.@url;
//タイトル、クレジット、リンクのテキストを入れて、ドロップシャドウをかける
var htmldata:String = "Title:" + titleStr + "
";
htmldata += "Credit:" + creditStr + "
";
htmldata += "" + linkURL + "";
var fld:TextField = new TextField();
fld.autoSize = TextFieldAutoSize.LEFT;
fld.width = 300;
fld.x = 50;
fld.y = 50;
fld.multiline = true;
fld.htmlText = htmldata;
var dsf:DropShadowFilter = new DropShadowFilter();
dsf.alpha = 0.6;
fld.filters = [dsf];
addChild(fld);
//画像のロード Loaderクラスは画像やSWFを読み込むクラスです。
var myLoader:Loader = new Loader();
// XMLから取り出した画像ファイルを呼び出す
var myURLRequest:URLRequest = new URLRequest(imgURL);
//クロスドメインポリシーファイルをドキュメントルートから取得,説明は下記に記載
var myLoaderContext:LoaderContext = new LoaderContext(true);
myLoader.load(myURLRequest, myLoaderContext);
myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteImg);
}
[/cc]
読み込んだXMLデータはこちら。(非常に長いので一部だけ)
[cc lang="xml"]
<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='Atom'">http://www.w3.org/2005/Atom' xmlns:gphoto='google.com/photos/2007'">http://schemas.google.com/photos/2007' xmlns:media='http://search.yahoo.com/mrss/' xmlns:openSearch='a9.com/-/spec/opensearchrss/1.0/'">http://a9.com/-/spec/opensearchrss/1.0/' version='2.0'>
http://picasaweb.google.com/buku2photo/Plants01#5360230958045632610
<media:group>
<media:content url="http://lh4.ggpht.com/8NULqSwdYxI/SmNdqBhcmGI/AAAAAAAADqM/FGcIdf8qtXI /s288/031013CIMG0646.jpg" height="216" width="288" type="image/jpeg" medium="image">
<media:credit>ブクブクあわだつ</media:credit>
<media:keywords>スベリヒユ科, 自宅, Portulaca, Water drop</media:keywords>
</media:content>
<gphoto:albumtitle>Plants 植物 01</gphoto:albumtitle>
<gphoto:albumctitle>Plants01</gphoto:albumctitle>
<gphoto:albumdesc>2001年~2005年</gphoto:albumdesc>
</media:group>
[/cc]
namespace
namespaceはこちらで任意の空間を設定できます。例えば同じ変数、メソッドがあってもnamespaceで分けておけば使うことが可能になります。
今回の例では<madia:group>に中にある<madia:credit>,<media:keywords>などを取り出す際に利用しています。
今回はdefaltでnamespaceを指定してます。
これだと自動的に
その場合は個別に指定します。
[cc lang="actionscript"]
var nsGphoto:Namedpace = new Namespace("http://schemas.google.com/photos/2007");
var gphototitle:String = myXML.channel.item[0].nsGphote::albumtitle;
[/cc]
このように、複数のnamespaceを読みこんだ方が適切な場合もあります。
LoaderContext
先ほど画像を呼び出す際にLoaderContextを使いました。
[cc lang="actionscript"]
var myLoaderContext:LoaderContext = new LoaderContext(true);
myLoader.load(myURLRequest, myLoaderContext);
[/cc]
これは先ほど画像を読み込んだurlがcrossdomain.xmlと同じドメインにないので、アクセスしても良いかどうか確認しています。
画像のurl
先ほどアクセス許可をもらっているurl
[注意点]
今回は呼び出した画像をBitmapに変更しているのでこのようなアクセス許可を確認しているのですが、特に加工をせず表示するのなら特に許可を確認する必要はありません。
今回参考のサンプル
参考文献