1/30 外部APIとの接続(XML)

外部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]

[*]と記載があるので、すべてのドメインからアクセスできます。
もしとあれば albatrus.comからのアクセスのみを許可するという意味になりその他のサイトからはアクセスできません。

例外として、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; //タグの中の1番上のタグのをtitleStrに納めている。<br /> var linkURL:String = myXML.channel.item[0].link;<br /> //namespaceを設定<br /> default <a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a> namespace = new Namespace("<a href="http://search.yahoo.com/mrss/">http://search.yahoo.com/mrss/</a>"); </p> <p> var creditStr:String = myXML.channel.item[0].group.credit;<br />     //@は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%C8">アトリビュート</a>。contentの中にはurl,type,heightなどが分かれているのでそのどれを使うかを@で指定する。<br /> var imgURL:String = myXML.channel.item[0].group.content.@url;  </p> <p> //タイトル、クレジット、リンクのテキストを入れて、ドロップシャドウをかける<br /> var htmldata:String = "Title:" + titleStr + "<br>";<br /> htmldata += "Credit:" + creditStr + "<br>";<br /> htmldata += "<a href="" + linkURL + "" mce_href="" + linkURL + "">" + linkURL + "</a>";<br /> var fld:TextField = new TextField();<br /> fld.autoSize = TextFieldAutoSize.LEFT;<br /> fld.width = 300;<br /> fld.x = 50;<br /> fld.y = 50;<br /> fld.multiline = true;<br /> fld.htmlText = htmldata;<br /> var dsf:DropShadowFilter = new DropShadowFilter();<br /> dsf.alpha = 0.6;<br /> fld.filters = [dsf];<br /> addChild(fld);</p> <p> //画像のロード Loaderクラスは画像やSWFを読み込むクラスです。<br /> var myLoader:Loader = new Loader();<br />     // <a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a>から取り出した画像ファイルを呼び出す<br /> var myURLRequest:URLRequest = new URLRequest(imgURL);<br /> //クロス<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3">ドメイン</a>ポリシーファイルをドキュメントルートから取得,説明は下記に記載<br /> var myLoaderContext:LoaderContext = new LoaderContext(true);<br /> myLoader.load(myURLRequest, myLoaderContext);<br /> myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteImg);<br /> }<br /> [/cc]</p> <p><p>読み込んだ<a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a>データはこちら。(非常に長いので一部だけ)<br /> [cc lang="<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a>"]<br /> <?<a class="keyword" href="http://d.hatena.ne.jp/keyword/xml">xml</a> version='1.0' encoding='<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>'?><<a class="keyword" href="http://d.hatena.ne.jp/keyword/rss">rss</a> xmlns:<a class="keyword" href="http://d.hatena.ne.jp/keyword/atom">atom</a>='<a href="http://www.w3.org/2005/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Atom">Atom</a>'">http://www.w3.org/2005/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Atom">Atom</a>'</a> xmlns:gphoto='<a href="http://schemas.<a class="keyword" href="http://d.hatena.ne.jp/keyword/google">google</a>.com/photos/2007'">http://schemas.<a class="keyword" href="http://d.hatena.ne.jp/keyword/google">google</a>.com/photos/2007'</a> xmlns:media='<a href="http://search.yahoo.com/mrss/'">http://search.yahoo.com/mrss/'</a> xmlns:<a class="keyword" href="http://d.hatena.ne.jp/keyword/openSearch">openSearch</a>='<a href="http://<a class="keyword" href="http://d.hatena.ne.jp/keyword/a9.com">a9.com</a>/-/spec/opensearchrss/1.0/'">http://<a class="keyword" href="http://d.hatena.ne.jp/keyword/a9.com">a9.com</a>/-/spec/opensearchrss/1.0/'</a> version='2.0'><br /> <channel><br /> <item><br /> <title><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DD%A1%BC%A5%C1%A5%E5%A5%E9%A5%AB">ポーチュラカ</a>、ハナ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%D9%A5%EA%A5%D2%A5%E6">スベリヒユ</a>

http://picasaweb.google.com/buku2photo/Plants01#5360230958045632610 buku2photo (ブクブクあわだつ)
<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を指定してます。
これだと自動的にの中から読み込むことになってしまいますので、の中のものは使えません。</media:keywords></madia:credit></madia:group>

その場合は個別に指定します。
[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

  • http://lh4.ggpht.com/8NULqSwdYxI/SmNdqBhcmGI/AAAAAAAADqM/FGcIdf8qtXI /s288/031013CIMG0646.jpg
  • 先ほどアクセス許可をもらっているurl

  • http://photos.googleapis.com/data/crossdomain.xml
  • [注意点]
    今回は呼び出した画像をBitmapに変更しているのでこのようなアクセス許可を確認しているのですが、特に加工をせず表示するのなら特に許可を確認する必要はありません。

    • テキスト:crossdomain.xmlの許可が必須
    • 画像:crossdomain.xmlの許可が不要なこともある

    今回参考のサンプル

    参考文献