Home > papervision3d > Amazon Web ServiceをActionScript3.0から利用する方法

Amazon Web ServiceをActionScript3.0から利用する方法

Amazon Web Service(AWS)をActionScript3.0から利用する方法をご紹介します。
AWSはURIで要求(REST)した結果をXMLで返してくれるデータベースサービスです。
ActionScript3.0は強力なXML操作の手段を提供してくれています。
それはE4X(ECMAScript for XML)と呼ばれる標準に沿った手法です。

それでは早速実装にかかります。

REST

AWSへのREST(Representational State Transfer)要求は以下の通りです。

var url:String = "http://webservices.amazon.co.jp/onca/xml?"
               + "Service=AWSECommerceService&"
               + "AWSAccessKeyId=[アクセスキーID]&"
               + "Operation=ItemSearch&"
               + "SearchIndex=Books&"
               + "Keywords=actionscript&"
               + "ResponseGroup=Request,Small";

「Books」カテゴリで「actionscript」のキーワードにヒットする商品のデータベースを取得します。

URLアクセス

ActionScript3.0でURLにアクセスします。

var loader:URLLoader;
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, completeFnc);
loader.load(new URLRequest(url));

URLのロードが完了(COMPLETE)したときcompleteFncというメソッドが実行されます。

ロード完了後に実行されるメソッド

URLのロードが完了したときに実行されるcompleteFncメソッドの実装です。

private function completeFnc(event:Event):void {
  var ns:String = "http://webservices.amazon.com/AWSECommerceService/2005-10-05";
  default xml namespace = new Namespace(ns);
  var xml : XML = new XML(loader.data);
 
  for each(var item:XML in xml..Item) {
    trace(item.ASIN[0]);
  }
}

まずは取得したXMLをパースします。

var ns:String = "http://webservices.amazon.com/AWSECommerceService/2005-10-05";
default xml namespace = new Namespace(ns);
var xml:XML = new XML(loader.data);

ここでポイントとなるのが名前空間(namespace)です。
E4Xでは名前空間が指定されたXMLの解析は必ず正確に取り扱う必要があります。
なぜなら名前空間はその中で使われる変数へのアクセスを制限するモノだからです。

AWSの名前空間は「http://webservices.amazon.com/AWSECommerceService/2005-10-05」です。

そして、ここで奇妙なシンタックスが出てきます。

default xml namespace = new Namespace(ns);

これで一纏まりのディレクティブです。詳細はコチラを参照下さい。

この設定でデフォルトの名前空間のURIを指定できます。
AWSはこのURIだけが名前空間として使用されていますので、これだけで十分です。

試しにASINの値を取得する

取得したXMLから、ASINの値を取得してみます。

for each(var item:XML in xml..Item) {
  trace(item.ASIN[0]);
}

Item要素を集める。

xml..Item

これによりxmlに含まれるItemタグを全て集めてXMLListにします。

XMLListを「for each」でイテレートします。

ASINというタグはItemタグの中に1つしかないので「item.ASIN[0]」として値を取得します。
E4Xでは「.(ピリオド)」を使ってタグの階層を辿っていきます。

Source Code

全ソースコードを公開しておきます。

package {
  import flash.display.Sprite;
  import flash.net.URLLoader;
  import flash.net.URLRequest;
  import flash.events.Event;
 
  public class AmazonWebservice extends Sprite
  {
    private var loader:URLLoader;
 
    public function AmazonWebservice()
    {
      var url:String = "http://webservices.amazon.co.jp/onca/xml?"
                     + "Service=AWSECommerceService&"
                     + "AWSAccessKeyId=[アクセスキーID]&"
                     + "Operation=ItemSearch&"
                     + "SearchIndex=Books&"
                     + "Keywords=actionscript&"
                     + "ResponseGroup=Request,Small";
      loader = new URLLoader();
      loader.addEventListener(Event.COMPLETE, completeFnc);
      loader.load(new URLRequest(url));
    }
 
    private function completeFnc(event:Event):void {
      var ns:String = "http://webservices.amazon.com/AWSECommerceService/2005-10-05";
      default xml namespace = new Namespace(ns);
      var xml:XML = new XML(loader.data);
 
      for each(var item:XML in xml..Item) {
        trace(item.ASIN[0]);
      }
    }
  }
}
おわりに

アマゾンのウェブサービスをActionScript3.0で利用する方法でした。
強力なE4Xのおかげで非常に簡単にアクセスする事ができましたが、名前空間の存在がハマリ所でした。
(だいぶ悩まされました…)

関連のありそうなエントリ

Comments:0

Comment Form
Remember personal info

*
To prove that you're not a bot, enter this code
Anti-Spam Image

Trackbacks:0

Trackback URL for this entry
http://www.adamrocker.com/blog/150/amazon_web_service_actionscript30_e4x.html/trackback/
Listed below are links to weblogs that reference
Amazon Web ServiceをActionScript3.0から利用する方法 from throw Life

Home > papervision3d > Amazon Web ServiceをActionScript3.0から利用する方法

Search
Feeds
Meta

Return to page top