楽天の商品検索APIを使って、商品のジャンル別検索を行う

2013年3月13日(水)
薬師寺 国安

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト3のコードを記述します。

ロジックコードを記述する

リスト3 (MainWindow.xaml.vb)

1Option Strict On

クライアントとサーバーの両方で使用できる HTTP のコンポーネント(HTTP ヘッダー、およびメッセージなど)に関するクラスの含まれる、System.Net.Http名前空間をインポートします。

1Imports System.Net.Http

PtoductInfoクラス内に文字列型の「画像」、「商品名」、「価格」、「サイト」プロパティを定義しておきます。

1Public Class ProductInfo
2  Property 画像 As String
3  Property 商品名 As String
4  Property 価格 As String
5  Property サイト As String
6End Class
7 
8Public NotInheritable Class MainPage
9  Inherits Page

楽天から取得したApplicationIDを定数メンバ変数として宣言します。

1ConstAppID As String = "楽天のApplicationID"

XML要素を表すXElementクラス型のメンバ変数xmldocを宣言します。

1Dim xmldoc As XElement

選択した「ジャンル」を格納するメンバ変数selectGenreIDを宣言します。

1Dim selectGenreID As String

ページがアクティブになった時の処理

XElement.LoadメソッドでXML文書ファイル(RakutenGenreId.xml)を読み込みます。

文字列型のリストである新しいtitleListオブジェクトを作成します。

Descendantsメソッドで全ての子孫要素であるに対して、各要素を変数resultに格納しながら、反復処理を行います。
titleListオブジェクトにAddメソッドで、要素の属性”title”の値を追加していきます。
ListBoxのItemsSourceプロパティにtitleListオブジェクトを指定します。
これで、リストボックスにジャンル名が表示されます。

1Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
2  xmldoc = XElement.Load("RakutenGenreId.xml")
3  Dim titleList As New List(Of String)
4 
5  For Each result In From c In xmldoc.Descendants("genreId") Select c
6    titleList.Add(result.Attribute("title").Value)
7  Next
8  ListBox1.ItemsSource = titleList
9End Sub

[OK]ボタンがクリックされた時の処理

TextBoxに入力された値をエンコードして変数myKeyWordに格納しておきます。

エンコードした+itemPriceを変数mySortに格納しておきます。これは価格を昇順にするパラメータです。

API へのリクエストは、対象商品カテゴリや検索キーワードなどの条件を下記のような URL で指定します。(REST)

Dim myUri As String = String.Format("https://app.rakuten.co.jp/services/api/IchibaItem/Search/20120723?applicationId={0}&keyword={1}&sort={2}&genreId={3}&format=xml", AppID, myKeyWord, mySort, selectGenreID)

applicationIdには楽天より取得したデベロッパー ID を指定します。
keyword には変数myKeyWordに格納されている、エンコードされたTextBoxの値が入ります。
sort には変数mySortに格納されている、エンコードされた「+itemPrice」が入ります。
価格順(昇順)で結果が返されます。
genreIdにはListBox(ListBox1)より選択されたジャンルIDが入ります。
formatにはレスポンス形式を指定します。ここではxmlを指定していますが、jsonを指定することもできます。

新しいHttpClientのインスタンスmyHttpClientオブジェクトを作成します。GetStringAsyncメソッドで、指定URIにGET要求を送信し、非同期操作で応答本体を文字列として受け取ります。受け取った結果XMLを変数myContentに格納します。

XElement.Parseメソッドで文字列として受け取ったXML(myContent)を読み込みます。

ProductInfoクラス型の新しいリストであるmyProductInfoオブジェクトを作成します。Descendantsメソッドで全ての子孫要素に対して、要素の内容を変数resultに格納しながら、反復処理を行います。

新しいProductInfoクラスの「画像」プロパティに要素の内容を指定します。
「商品名」プロパティには要素の値を指定します。
「価格」プロパティには要素の値を、文字列「円」と連結して指定します。
「サイト」プロパティには、要素の値を指定します。
これらのプロパティの設定されたProductInfoクラスを、AddメソッドでmyProductInfoオブジェクトに追加します。

resultListBoxのItemsSourceプロパティにmyProductInfoオブジェクトを指定します。検索結果の一覧が画像付きで、リストボックスに表示されます。

01Private Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click
02  Dim myKeyWord As String = Uri.EscapeDataString(searchTextBox.Text)
03  Dim mySort As String = Uri.EscapeDataString("+itemPrice")
04  Dim myUri As String = String.Format("https://app.rakuten.co.jp/services/api/IchibaItem/Search/20120723?applicationId={0}&keyword={1}&sort={2}&genreId={3}&format=xml", AppID, myKeyWord, mySort, selectGenreID)
05  Dim myHttpClient As New HttpClient
06  Dim myResponse = myHttpClient.GetStringAsync(New Uri(myUri, UriKind.Absolute))
07  Dim myContent = myResponse.Result
08  Dim xmldoc As XElement = XElement.Parse(myContent)
09 
10  Dim myProductInfo As New List(Of ProductInfo)
11  For Each result In From c In xmldoc.Descendants("Item") Select c
12    With myProductInfo
13      .Add(New ProductInfo With {.画像 = result.Element("mediumImageUrls").Value,
14      .商品名 = result.Element("itemName").Value,
15      .価格 = String.Format("{0:n0}円", Integer.Parse(result.Element("itemPrice").Value)),
16      .サイト = result.Element("itemUrl").Value})
17    End With
18  Next
19  resultListBox.ItemsSource = myProductInfo
20End Sub

ジャンルのリストボックスから項目が選択された時の処理

ListBox1の選択されたインデックスに該当する要素の値を取得して、メンバ変数selectGenreIDに格納します。
[OK]ボタンの使用を可能にします。

1Private Sub ListBox1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
2  selectGenreID = xmldoc.Descendants("genreId")(ListBox1.SelectedIndex).Value
3  okButton.IsEnabled = True
4End Sub

検索結果の一覧が表示されているリストボックスから、項目を選択した時の処理

リストボックスから選択した項目を、ProductInfoクラスにキャストして、「サイト」を取得し、変数mySiteに格納します。WebBrowserのNavigateメソッドで変数mySiteに格納されたURLに遷移します。

1  Private Sub resultListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles resultListBox.SelectionChanged
2    Try
3      Dim mySite As String = DirectCast(resultListBox.SelectedItem, ProductInfo).サイト
4      WebBrowser1.Navigate(New Uri(mySite, UriKind.Absolute))
5    Catch
6      Exit Sub
7    End Try
8  End Sub
9End Class

今回はここまでです。ありがとうございました。

  • 楽天の商品検索APIを使って、商品のジャンル別検索を行うアプリサンプル

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています