連載 .NETでWindowsアプリを作ろう

第4回 Amazon用プラグインでAmazon Webサービスでも画像検索

デジタルアドバンテージ 遠藤 孝信
2006/01/14
Page1 Page2 Page3

プロキシ・クラスのインスタンス化とメソッド呼び出し

 ECS4でキーワードにより商品を検索し、商品の詳細ページや画像のURLを得るために最小限必要なコードを記述すると以下のようになります。このコードでは、「スターウォーズ」の「DVD」を検索し、その結果を10件分表示します(コードの詳細は後述)。なおコードを短くするために、エラー処理はすべて省いています。

static void Main(string[] args)
{
  // ItemSearchRequestオブジェクト作成
  ItemSearchRequest searchRequest = new ItemSearchRequest();
  searchRequest.Keywords = "スターウォーズ";
  searchRequest.SearchIndex = "DVD";
  searchRequest.ResponseGroup = new string [] { "ItemAttributes", "Images" };
  searchRequest.ItemPage = "1";

  // ItemSearchオブジェクト作成
  ItemSearch search = new ItemSearch();
  search.SubscriptionId = "14HA028HBEN2D7NVSVG2";
  search.Request = new ItemSearchRequest[] { searchRequest };

  // Webサービスの呼び出し
  AWSECommerceService ecs4 = new AWSECommerceService();
  ItemSearchResponse searchResponse = ecs4.ItemSearch(search);

  // 検索結果表示
  Items items = searchResponse.Items[0];
  Console.WriteLine("検索結果件数:{0}", items.TotalResults);
  Console.WriteLine("総ページ数:{0}", items.TotalPages);

  int i = 1;
  foreach (Item item in items.Item)
  {
    Console.WriteLine(i++);
    Console.WriteLine("タイトル:{0}", item.ItemAttributes.Title);
    Console.WriteLine("詳細ページ:{0}", item.DetailPageURL);
    Console.WriteLine("画像小URL:{0}", item.SmallImage.URL);
    Console.WriteLine("画像中URL:{0}", item.MediumImage.URL);
    Console.WriteLine("画像大URL:{0}", item.LargeImage.URL);
  }
  Console.ReadLine();
}
Sub Main()
  ' ItemSearchRequestオブジェクト作成
  Dim searchRequest As New ItemSearchRequest
  searchRequest.Keywords = "スターウォーズ"
  searchRequest.SearchIndex = "DVD"
  searchRequest.ResponseGroup = New String() {"ItemAttributes", "Images"}
  searchRequest.ItemPage = "1"

  ' ItemSearchオブジェクト作成
  Dim search As New ItemSearch
  search.SubscriptionId = "14HA028HBEN2D7NVSVG2"
  search.Request = New ItemSearchRequest() { searchRequest }

  ' Webサービスの呼び出し
  Dim ecs4 As New AWSECommerceService
  Dim searchResponse As ItemSearchResponse = ecs4.ItemSearch(search)

  ' 検索結果表示
  Dim myItems As Items = searchResponse.Items(0)
  Console.WriteLine("検索結果件数:{0}", myItems.TotalResults)
  Console.WriteLine("総ページ数:{0}", myItems.TotalPages)

  Dim i As Integer = 1
  For Each myItem As Item In myItems.Item
    Console.WriteLine(i)
    Console.WriteLine("タイトル:{0}", myItem.ItemAttributes.Title)
    Console.WriteLine("詳細ページ:{0}", myItem.DetailPageURL)
    Console.WriteLine("画像小URL:{0}", myItem.SmallImage.URL)
    Console.WriteLine("画像中URL:{0}", myItem.MediumImage.URL)
    Console.WriteLine("画像大URL:{0}", myItem.LargeImage.URL)
    i += 1
  Next
  Console.ReadLine()
End Sub
ECS4で「スターウォーズ」のDVDを検索するサンプル・プログラム(上:C#、下:VB.NET)
プログラムの先頭で、ECSTest.com.amazon.webservices名前空間を参照する必要がある(プロジェクト名を「ECSTest」とした場合)。

 検索データ(ItemSearchRequestオブジェクト)も、実際の検索結果(Itemsオブジェクト)も、ともに配列となっている点に注意してください。これは、ECS4が1度の呼び出しで複数の検索(最高2つ)を行えるようになっているためです。

 さて、このプログラムを実行すれば、次のような画面が表示されるはずです。

上記サンプル・プログラムの実行結果

 この内容は、AmazonのWebサイトでジャンルとして「DVD」を選択し、「スターウォーズ」を検索した場合の検索結果と同一になっていると思います。

Amazon(Webサイト)での検索結果
ジャンルとして「DVD」を選択し、「スターウォーズ」を検索した場合の検索結果画面。ECS4を利用した場合と同一の検索結果となるようである。

■ECS4で検索するのに必要な型

 上記のサンプル・プログラムで登場する主要な4つの型について、利用しているフィールドの説明を次の表にまとめておきます。

フィールド 説明
Keywords 検索キーワードを指定する
SearchIndex 検索するカテゴリを指定する(「DVD」「Books」「Software」など)
ResponseGroup 検索結果として取得したい商品の情報の種類を文字列の配列で指定。指定できる文字列はECS4で定義されている。「ItemAttributes」を指定すれば、商品に関する基本的なデータ(タイトルや詳細ページのURLなど)が取得できる。また、「Images」を指定すれば、3つのサイズの画像が取得できる。よく利用される種類を組み合わせた「Small」や「Medium」なども指定可能
ItemPage ECS4では検索結果はページ分割される。1度の検索では検索結果を10件までしか取得できない(10件が1ページ)。このプロパティでは何ページ目の検索結果を取得するかを文字列で指定する
ItemSearchRequestクラス
 
フィールド 説明
SubscriptionId 開発者登録IDを指定する。登録IDはここから取得可能(無料)
Request ItemSearchRequestオブジェクトの配列を指定する。これにより、1度のWebサービス呼び出しで、複数の検索が可能(最高2つまで)
ItemSearchクラス
 
フィールド 説明
TotalResults 検索結果の件数
TotalPages 検索結果の総ページ数
Item 検索結果である個々の商品に対応したItemオブジェクトの配列
Itemsクラス
 
フィールド 説明
ItemAttributes.Title 商品のタイトル(ItemAttributesオブジェクトには商品に関する詳細なデータが含まれる)
DetailPageURL 商品の詳細ページのURL
SmallImage.URL 商品の画像(小)のURL
MediumImage.URL 商品の画像(中)のURL
LargeImage.URL 商品の画像(大)のURL
Itemクラス

 検索結果については、すべてのフィールドに値が入っているとは限らないため、実際には、その値を利用する前にnull(VB.NETの場合にはNothing)かどうかをチェックする必要があります。

■Amazon用プラグインの実装

 上記のサンプル・プログラムで、Amazon用プラグインを実装するためのコードはすべてそろっています。また、プラグインとなるDLLファイル(クラス・ライブラリ)を作成するための手順はすでに第1回目のGoogle用プラグインの作成で解説しています。

 ここでは、前回で用意したプロジェクトのZIPファイル(C#版VB.NET版)に追加する形でAmazon用プラグインを実装する手順について説明します。

 まずは、前回のZIPファイルに含まれるWebImageSearchディレクトリにあるソリューションを開き、テンプレートとしてクラス・ライブラリを選択して新規プロジェクト「WISAmazon」を追加します。自動作成されるClass1.cs/Class1.vbは、AmazonECS4.cs/AmazonECS4.vbという名前に変更しておきます。

 次に、先ほどと同様にしてWISAmazonのプロジェクトでWeb参照の追加を行います。また、プロジェクトではWebImageクラスとIWebImageインターフェイスを含んでいるWebImageLib.dllを参照設定します(プロジェクトの依存関係としてWebImageLibプロジェクトに依存関係を設定してもよい)。

 復習しておくと、WebImageクラスは検索結果から得られた画像を示すクラスであり、IWebImageインターフェイスはプラグインが実装しなければならない、検索のための一連のメソッドを定義したものです。

 AmazonECS4.cs/AmazonECS4.vbで記述するコードは以下のようになります。

 このソース・コードで1つ注意が必要な点は、抽象クラスであるAmazonBaseクラスを定義しているところです。

 ECS4では基本的に複数のカテゴリ(「DVD」や「Books」など)にまたがった検索ができないため、このソース・コードではECS4でDVDを検索するプラグイン(AmazonDVDクラス)と書籍を検索するプラグイン(AmazonBookクラス)を別々に実装しています(このため結果的に、1つのDLLファイルに2つのプラグインが含まれることになります)。

 これら2つのプラグインの違いは、ECS4のリクエストのSearchIndexプロパティに設定する値(DVD、Books)と、IWebImageインターフェイスのNameプロパティで返す値(「Amazon DVD」「Amazon 和書」)だけです。このため、Webサービス呼び出しなどの共通部分はAmazonBaseクラスで実装し、AmazonDVDとAmazonBookクラスはその派生クラスとして実装しています。


 INDEX
  .NETでWindowsアプリを作ろう
  第4回 Amazon用プラグインでAmazon Webサービスでも画像検索
    1.Amazon用プラグインの作成(1)
  2.Amazon用プラグインの作成(2)
    3.アプリケーション本体の改造
 
インデックス・ページヘ  「.NETでWindowsアプリを作ろう 」


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 記事ランキング

本日 月間