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

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

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

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

リスト3 (MainWindow.xaml.vb)

Option Strict On

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

Imports System.Net.Http

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

Public Class ProductInfo
  Property 画像 As String
  Property 商品名 As String
  Property 価格 As String
  Property サイト As String
End Class

Public NotInheritable Class MainPage
  Inherits Page

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

  ConstAppID As String = "楽天のApplicationID"

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

  Dim xmldoc As XElement

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

  Dim selectGenreID As String

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

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

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

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

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    xmldoc = XElement.Load("RakutenGenreId.xml")
    Dim titleList As New List(Of String)
 
    For Each result In From c In xmldoc.Descendants("genreId") Select c
      titleList.Add(result.Attribute("title").Value)
    Next
    ListBox1.ItemsSource = titleList
  End 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オブジェクトを指定します。検索結果の一覧が画像付きで、リストボックスに表示されます。

  Private Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click
    Dim myKeyWord As String = Uri.EscapeDataString(searchTextBox.Text)
    Dim mySort As String = Uri.EscapeDataString("+itemPrice")
    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)
    Dim myHttpClient As New HttpClient
    Dim myResponse = myHttpClient.GetStringAsync(New Uri(myUri, UriKind.Absolute))
    Dim myContent = myResponse.Result
    Dim xmldoc As XElement = XElement.Parse(myContent)
 
    Dim myProductInfo As New List(Of ProductInfo)
    For Each result In From c In xmldoc.Descendants("Item") Select c
      With myProductInfo
        .Add(New ProductInfo With {.画像 = result.Element("mediumImageUrls").Value,
        .商品名 = result.Element("itemName").Value,
        .価格 = String.Format("{0:n0}円", Integer.Parse(result.Element("itemPrice").Value)),
        .サイト = result.Element("itemUrl").Value})
      End With
    Next
    resultListBox.ItemsSource = myProductInfo
  End Sub

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

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

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

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

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

  Private Sub resultListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles resultListBox.SelectionChanged
    Try
      Dim mySite As String = DirectCast(resultListBox.SelectedItem, ProductInfo).サイト
      WebBrowser1.Navigate(New Uri(mySite, UriKind.Absolute))
    Catch
      Exit Sub
    End Try
  End Sub
End 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メルマガ会員のサービス内容を見る

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