楽天の商品検索APIを使って、商品のジャンル別検索を行う
次に、ソリューションエクスプローラー内の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メソッドで全ての子孫要素である
titleListオブジェクトにAddメソッドで、
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メソッドで全ての子孫要素
新しい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の選択されたインデックスに該当する
[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を使って、商品のジャンル別検索を行うアプリサンプル