.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 <オプション> <WSDLのURL>
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のデータベースから取得した商品情報が一覧表示されれば成功だ。End of Article

カテゴリ:Webフォーム 処理対象:Webサービス
 
この記事と関連性の高い別の.NET TIPS
[Web参照の追加]ダイアログをカスタマイズするには?
Windowsサービスのサービス名を列挙するには?
[Silverlight 2]ASP.NET開発サーバでclientaccesspolicy.xmlを利用するには?
Windowsサービスを開始/停止/一時停止/再開するには?
[ASP.NET AJAX]DynamicPopulateコントロールでXML Webサービスを非同期に呼び出すには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間