|
.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
|
|