|  | 
          
 
            
| .NET TIPS [ASP.NET]WebフォームからAmazon Webサービスを利用するには?山田 祥寛2005/05/13
 |  | 
          
 
            
| 
 | 
        
  恐らく本稿を読まれている読者諸兄のほとんどが、Amazon.co.jp(以降、Amazon)が提供しているサービスを、一度は利用したことがあるのではないだろうか。Amazonはもともとが書籍販売を中心としたサイトであるが、品ぞろえ、書評などの豊富さから、書籍特化型の検索エンジンとしても十分に利用できる。
 本稿では、Amazonが提供するXML Webサービスである「Amazon Webサービス」を利用する方法について紹介する。Amazon Webサービスを利用することで、Amazonが保有している膨大なデータベースをあたかも自前のデータベース・サーバであるかのように検索することができる。
 それではさっそく、具体的なサンプルを見てみることにしよう。
1.プロキシ・クラスを生成する
 プロキシ(代理)・クラスとは、その名のとおり、ユーザー・アプリケーションに成り代わって、XML Webサービスとの通信を取り持つクラスのことだ。プロキシ・クラスを間に介すれば、アプリケーション開発者はXML Webサービスを意識する必要はない。ローカル環境に用意されたクラス・ライブラリを利用するのとまったく同じ感覚で、XML Webサービスを利用できる。
 プロキシ・クラスを生成するのは簡単だ。.NET Framework SDKに含まれているwsdlコマンド(Webサービス記述言語ツール)を用いることで、あらかじめAmazonから提供されているAmazon WebサービスのWSDLからプロキシ・クラスを自動生成することができる(なお、Visual Studio .NETの[Web参照の追加]を利用した場合には、1、2のプロキシ・クラス生成の作業は省略できる)。
 実際にプロキシ・クラスを自動生成してみよう。コマンド・プロンプトから、以下のコマンドを入力してほしい。
| 
| > wsdl /l:VB /n:Com.Msn.Wings.Sample http://soap.amazon.co.jp/schemas3/AmazonWebServices.wsdl |  | 
 
| VB.NETのプロキシ・クラスを生成するコマンド入力の例 | 
| プロキシ・クラスはWSDLから自動生成できる。これを行うには、Webサービス記述言語ツール(Wsdl.exe)を使用すればいい。オプションの内容は後述。ここでは、クラスの言語にVB.NET、名前空間に「Com.Msn.Wings.Sample」、WSDLのURLに「http://soap.amazon.co.jp/schemas3/AmazonWebServices.wsdl」を指定している。 | 
 wsdlコマンドの一般的な構文は、以下のとおりだ。
 また、wsdlコマンドで利用可能な主要なオプションを以下に示しておく。
| オプション | 概要 | 
| /d[omain]:ドメイン名 | 認証時に使用するドメイン名 | 
| /l[anguage]:言語名 | プロキシ・クラス作成時に使用する言語。C#なら「CS」(デフォルト)、VB.NETなら「VB」など | 
| /n[amespace]:名前空間名 | プロキシ・クラスが属する名前空間名 | 
| /nologo | wsdlコマンドの著作権情報を非表示 | 
| /o[ut]:ファイル名 | プロキシ・クラスを保存するファイル名 | 
| /p[assword]:パスワード | 認証時に使用するパスワード | 
| /protocol:プロトコル名 | 実装するプロトコル。SOAP(デフォルト)、HttpGet、HttpPost | 
| /proxy:URL | 接続時に使用するプロキシ・サーバのURL | 
| /urlkey:キー名 | プロパティ既定値を読み込むために使用する構成キー | 
| /u[sername]:ユーザー名 | 認証時に使用するユーザー名 | 
|  | 
| wsdlコマンドで利用可能な主なオプション | 
 wsdlコマンドによって、「AmazonSearchService.vb」のようなソース・ファイルが生成されれば成功だ(/lオプションに「CS」を指定するか、または無指定だった場合には、C#のコードで「AmazonSearchService.cs」というソース・ファイルが生成される)。
2.プロキシ・クラスをコンパイルする
 wsdlコマンドは、プロキシ・クラスのソース・コードを生成するだけなので、使用するに当たってはコンパイル処理を行う必要がある。
| 
| >vbc /t:library /r:System.dll /r:System.Web.Services.dll 
/r:System.Xml.dll AmazonSearchService.vb |  | 
 
| VB.NETの場合のコンパイル方法 | 
 
| 
| > csc /t:library AmazonSearchService.cs |  | 
 
| C#の場合のコンパイル方法 | 
 このコンパイルに成功した場合、VB.NET、C#いずれにおいても、AmazonSearchService.dllが生成されるので、これをアプリケーション・ルート配下の「bin」フォルダにコピーすればよい。
3.XML Webサービスを利用する
 以上で、任意のWebフォームからAmazon Webサービスを利用するための準備は完了だ。次に、先ほど生成したプロキシ・クラス経由でAmazon Webサービスを利用するWebフォームを実際に作成してみよう。具体的なコード例を以下に示す。
| 
| <%@ Page ContentType="text/html" Language="C#" %><%@ Import Namespace="System.Data" %>
 <%@ Import Namespace="Com.Msn.Wings.Sample" %>
 <script runat="Server">
 public void Page_Load(Object sender, EventArgs e) {
 DataRow row = null;
 
 // Amazonの検索結果を格納するためのDataTableを定義
 DataTable data = new DataTable("amazon");
 data.Columns.Add("Asin",Type.GetType("System.String"));
 data.Columns.Add("ImageUrlSmall",Type.GetType("System.String"));
 data.Columns.Add("ProductName",Type.GetType("System.String"));
 data.Columns.Add("Author",Type.GetType("System.String"));
 data.Columns.Add("Manufacturer",Type.GetType("System.String"));
 data.Columns.Add("ListPrice",Type.GetType("System.String"));
 data.Columns.Add("Availability",Type.GetType("System.String"));
 
 // キーワード検索のための条件を設定
 KeywordRequest keywd = new KeywordRequest();
 keywd.keyword = "山田祥寛"; // 検索キーワード
 keywd.sort = "+salesrank";  // ソート順(売り上げ順)
 keywd.type = "heavy";  // 取得する結果タイプ(heavy|lite)
 keywd.page = "1";  // ページ番号
 keywd.mode = "books-jp";  // 検索先
 keywd.locale = "jp";  // 使用するロケール
 keywd.tag = "xxxxx";  // アソシエイトID
 keywd.devtag = "xxxxxxxxxxxxx";  // 登録ID
 
 // 検索条件に基づいて、Amazonデータベースを検索
 AmazonSearchService amazon = new AmazonSearchService();
 ProductInfo pi = amazon.KeywordSearchRequest(keywd);
 
 // 検索結果(ProductInfo)から
 // 個々の商品情報(Detailsオブジェクト)を取得
 // 取得した商品情報はDataTableオブジェクトにセット
 foreach (Details detail in pi.Details) {
 row = data.NewRow();
 row["Asin"] = detail.Asin;
 row["ImageUrlSmall"] = detail.ImageUrlSmall;
 row["ProductName"] = detail.ProductName;
 row["Author"] = detail.Authors[0];
 row["Manufacturer"] = detail.Manufacturer;
 row["ListPrice"] = detail.ListPrice;
 row["Availability"] = detail.Availability;
 data.Rows.Add(row);
 }
 // DataTableオブジェクトをRepeaterコントロールにバインド
 books.DataSource = data;
 Page.DataBind();
 }
 </script>
 <h1>Amazon書籍検索結果</h1>
 <asp:Repeater id="books" runat="Server">
 <ItemTemplate>
 <table border="0">
 <tr>
 <td>
 <a href="http://www.amazon.co.jp/exec/obidos/ASIN/<%# DataBinder.Eval(Container.DataItem, "Asin") %>/wings-22/" target="_blank">
 <img src="<%# DataBinder.Eval(Container.DataItem, "ImageUrlSmall") %>"
 border="0" /></a>
 </td>
 <td valign="top">
 <font size="-1">
 <%# DataBinder.Eval(Container.DataItem, "ProductName") %><br />
 <%# DataBinder.Eval(Container.DataItem, "Author") %>
 (<%# DataBinder.Eval(Container.DataItem, "Manufacturer") %>/
 <%# DataBinder.Eval(Container.DataItem, "ListPrice") %>)<br />
 <%# DataBinder.Eval(Container.DataItem, "Availability") %>
 </font>
 </td>
 </table>
 <p><hr /></p>
 </ItemTemplate>
 </asp:Repeater>
 |  | 
 
| Amazon Webサービスに対してキーワード検索を行うためのWebフォーム(C#版:amazon_cs.aspx) | 
 
| 
| <%@ Page ContentType="text/html" Language="VB" %><%@ Import Namespace="System.Data" %>
 <%@ Import Namespace="Com.Msn.Wings.Sample" %>
 <script runat="Server">
 Public Sub Page_Load(sender As Object, e As EventArgs)
 Dim row As DataRow
 
 ' Amazonの検索結果を格納するためのDataTableを定義
 Dim data As New DataTable("amazon")
 data.Columns.Add("Asin",Type.GetType("System.String"))
 data.Columns.Add("ImageUrlSmall",Type.GetType("System.String"))
 data.Columns.Add("ProductName",Type.GetType("System.String"))
 data.Columns.Add("Author",Type.GetType("System.String"))
 data.Columns.Add("Manufacturer",Type.GetType("System.String"))
 data.Columns.Add("ListPrice",Type.GetType("System.String"))
 data.Columns.Add("Availability",Type.GetType("System.String"))
 
 ' キーワード検索のための条件を設定
 Dim keywd As New KeywordRequest()
 keywd.keyword = "山田祥寛" ' 検索キーワード
 keywd.sort = "+salesrank"  ' ソート順(売り上げ順)
 keywd.type = "heavy"  ' 取得する結果タイプ(heavy|lite)
 keywd.page = "1"  ' ページ番号
 keywd.mode = "books-jp"  ' 検索先
 keywd.locale = "jp"  ' 使用するロケール
 keywd.tag = "xxxxx"  ' アソシエイトID
 keywd.devtag = "xxxxxxxxxxxxx"  ' 登録ID
 
 ' 検索条件に基づいて、Amazonデータベースを検索
 Dim amazon As New AmazonSearchService()
 Dim pi As ProductInfo = amazon.KeywordSearchRequest(keywd)
 
 ' 検索結果(ProductInfo)から
 
 ' 個々の商品情報(Detailsオブジェクト)を取得' 取得した商品情報はDataTableオブジェクトにセット
For Each detail As Details In pi.Details
 row = data.NewRow()
 row("Asin") = detail.Asin
 row("ImageUrlSmall") = detail.ImageUrlSmall
 row("ProductName") = detail.ProductName
 row("Author") = detail.Authors(0)
 row("Manufacturer") = detail.Manufacturer
 row("ListPrice") = detail.ListPrice
 row("Availability") = detail.Availability
 data.Rows.Add(row)
 Next
 ' DataTableオブジェクトをRepeaterコントロールにバインド
 books.DataSource = data
 Page.DataBind()
 End Sub
 </script>
 <h1>Amazon書籍検索結果</h1>
 <asp:Repeater id="books" runat="Server">
 <ItemTemplate>
 <table border="0">
 <tr>
 <td>
 <a href="http://www.amazon.co.jp/exec/obidos/ASIN/<%# DataBinder.Eval(Container.DataItem, "Asin") %>/wings-22/" target="_blank">
 <img src="<%# DataBinder.Eval(Container.DataItem, "ImageUrlSmall") %>"
 border="0" /></a>
 </td>
 <td valign="top">
 <font size="-1">
 <%# DataBinder.Eval(Container.DataItem, "ProductName") %><br />
 <%# DataBinder.Eval(Container.DataItem, "Author") %>
 (<%# DataBinder.Eval(Container.DataItem, "Manufacturer") %>/
 <%# DataBinder.Eval(Container.DataItem, "ListPrice") %>)<br />
 <%# DataBinder.Eval(Container.DataItem, "Availability") %>
 </font>
 </td>
 </table>
 <p><hr /></p>
 </ItemTemplate>
 </asp:Repeater>
 |  | 
 
| Amazon Webサービスに対してキーワード検索を行うためのWebフォーム(VB.NET版:amazon_vb.aspx) | 
 Amazon Webサービスを利用するには、先ほど作成したプロキシ・クラスが属する名前空間をインポートするだけでよい。名前空間はwsdlコマンドの/nオプションで自由に設定できるが、本稿の例では、Com.Msn.Wings.Sample名前空間としている。これで、Amazon Webサービスが提供する一連のメソッドにアクセスできるようになった。なお、上記のコードで利用しているKeywordRequestクラス、ProductInfoクラス、Detailsクラスなどは、WSDLの情報からwsdlコマンドにより自動生成されるクラスである。
 KeywordRequestクラスはAmazon Webサービスが提供するクラスで、キーワード検索を行うための諸条件を管理するためのものだ。このクラスに対して必要なパラメータ値を渡すことで、Amazon Webサービスに対して検索問い合わせを行うことができる。
 KeywordRequestオブジェクトのtagプロパティに指定している「アソシエイトID」は、Amazonのアソシエイト・プログラムに参加する際に必要となるIDで、Webサービスを利用するに当たっては必ずしも必須ではない。KeywordRequestオブジェクトのdevtagプロパティに指定している「登録ID」は開発者を識別するためのIDで、こちらはAmazon Webサービスのサイトから取得できるので、自身で適宜手続きを行っていただきたい(こちらは必須である)。
 必要なパラメータを設定したら、AmazonSearchServiceオブジェクトのKeywordSearchRequestメソッドで検索処理を実行する。KeywordRequestSearchメソッドは、キーワード検索を行うためのメソッドで、検索結果全般に関する情報を含むProductInfoクラスを戻り値として返す。個々の書籍に関する詳細情報を取得するには、ProductInfoオブジェクトのDetailsプロパティを使用すればよい。
 Detailsプロパティは、詳細情報を含むDetailsクラスの配列を返すので、foreach(For Each)ループで配列の内容を順に処理すればよい。なお、Detailsクラスに含まれる情報の内容は、KeywordRequestオブジェクトのtypeプロパティに「heavy」「lite」いずれを指定するかによって異なるので、注意すること。heavyを指定することで、より多くの情報にアクセスすることができるが、やりとりされる情報量が多くなるため、その分、通信のオーバーヘッドは増加する。
 さて、以上の内容が確認できたら、Webフォームの動作を確認してみよう。
 
|  | 
 
| Amazon Webサービスによるキーワード検索の結果 | 
 この画面例のように、Amazonのデータベースから取得した商品情報が一覧表示されれば成功だ。
          
 
            
| カテゴリ:Webフォーム 処理対象:Webサービス | 
        
 
        
| 
 
|  | generated by |  |