楽天Webサービスを利用したジャンル別商品検索

2011年10月24日(月)
PROJECT KySS

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

リスト3 (MainPage.xaml.vb)

Option Strict On
Imports System.Xml.Linq
Imports System.Net

ユーザーに電話の発信や、メールの送信、写真を撮るなどの一連のタスクを提供するクラスの含まれる、Microsoft.Phone.Tasks名前空間をインポートします。WebBrowserTaskを使用するためにこの名前空間が必要です。
Imports Microsoft.Phone.Tasks

ProductInfoクラス内で、文字列型の「画像」、「商品名」、「価格」、「サイト」プロパティを定義しています。
Public Class ProductInfo
  Property 画像 As String
  Property 商品名 As String
  Property 価格 As String
  Property サイト As String
End Class

Partial Public Class MainPage
  Inherits PhoneApplicationPage

  ' Constructor
  Public Sub New()
    InitializeComponent()
  End Sub

定数変数AppIDを宣言し、値に「楽天Webサービスより取得したデベロッパーID」を指定します。
  Const AppID As String = "楽天Webサービスより取得したデベロッパーID"

XML要素を表す、XElementクラスのメンバ変数xmldocを宣言します。
  Dim xmldoc As XElement
  Dim selectGenreID As String

ページが読み込まれた時の処理

XElement.Loadメソッドで、商品のジャンルIDを記述したXML文書を読み込みます。
文字列型の新しいリストであるtitleListを作成します。
Descendantsメソッドで、子孫要素であるすべての <genreId>要素のコレクションに対して、各要素を変数 resultに格納しながら、Addメソッドで<genreId>要素の属性”title”の値を、リストであるtitleListに追加していきます。
ListBox(genreListBox)のItemsSourceプロパティにtitleListオブジェクトを指定します。これで、商品のジャンル一覧が表示されます。
  Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    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
    genreListBox.ItemsSource = titleList
  End Sub

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

TextBoxに入力された値をエンコードして変数myKeyWordに格納しておきます。
エンコードした+itemPriceを変数mySortに格納しておきます。これは価格を昇順にするパラメータです。
API へのリクエストは、対象商品カテゴリや検索キーワードなどの条件を下記のような URL で指定します。(REST)
Dim myUri As String = String.Format("http://api.rakuten.co.jp/rws/3.0/rest?developerId={0}&operation=ItemSearch&version=2010-09-15&keyword={1}&sort={2}&genreId={3}", AppID, myKeyWord, mySort, selectGenreID)
developerId には楽天より取得したデベロッパー ID を指定します。operation には「ItemSearch」と指定します。API バージョン「version=2010-09-15」は固定値です。keyword には 変数myKeyWordに格納されている、エンコードされたTextBoxの値が入ります。sort には変数 mySort に格納されている、エンコードされた「+itemPrice」が入ります。価格順 (昇順) で結果が返されます。genreId には ListBox(genreListBox)より選択されたジャンルIDが入ります。

新しいWebClientのインスタンスmyWebClientオブジェクトを生成します。DownloadStringAsyncメソッドで、Uri として指定したリソースをダウンロードします。
AddHandler ステートメントでダウンロードが完了した DownloadStringCompleted イベントに、イベント ハンドラーを追加します。イベント ハンドラー内では、ダウンロードされた文字列としての結果 XML を、Parse メソッドで読み込みます。Descendants メソッドで、子孫要素であるすべての <Item> 要素のコレクションに対して、各要素を変数 result に格納しながら、ProductInfo クラスの「画像」、「商品名」、「価格」、「サイト」プロパティに、<mediumImageUrl>、<itemName>、<itemPrice> 、<itemUrl>要素の値を指定し、ProductInfo クラスの新しいリストとして作成した、myProductInfo オブジェクトに追加していきます。
「楽天商品検索API」の出力パラメータについては、下記URLを参照してください。
http://webservice.rakuten.co.jp/api/itemsearch/

  Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim myKeyWord As String = HttpUtility.UrlEncode(TextBox1.Text)
    Dim mySort As String = HttpUtility.UrlEncode("+itemPrice")
 
    Dim myUri As String = String.Format("http://api.rakuten.co.jp/rws/3.0/rest?developerId={0}&operation=ItemSearch&version=2010-09-15&keyword={1}&sort={2}&genreId={3}", AppID, myKeyWord, mySort, selectGenreID)
    Dim myWebClient As New WebClient
    myWebClient.DownloadStringAsync(New Uri(myUri, UriKind.Absolute))
 
    AddHandler myWebClient.DownloadStringCompleted, Sub(resultSender As Object, resultArgs As DownloadStringCompletedEventArgs)
      Dim xmldoc As XElement = XElement.Parse(resultArgs.Result)
      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("mediumImageUrl").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
  End Sub

ListBox(genreListBox)からジャンルが選択された時の処理

メンバ変数selectGenreIDに、選択された項目のインデックスに該当する、<genreId>要素の値を格納しておきます。[OK]ボタンの使用を可能にします。
  Private Sub genreListBox_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles genreListBox.SelectionChanged
    selectGenreID = xmldoc.Descendants("genreId")(genreListBox.SelectedIndex).Value
    Button1.IsEnabled = True
  End Sub

検索結果のListBox(resultListBox)から、項目が選択された時の処理

DirectCastでListBoxより選択された項目を、ProductInfoクラスにキャストして、サイトプロパティの値を取得して、変数mySiteに格納しています。
新しいWebBrowserTaskのインスタンスmyBrowserTaskを生成し、Uriプロパティに変数mySiteの値を絶対Uriで指定します。Showメソッドで、指定したサイトを表示します。

  Private Sub resultListBox_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles resultListBox.SelectionChanged
    Try
      Dim mySite As String = DirectCast(resultListBox.SelectedItem, ProductInfo).サイト
      Dim myBrowserTask As New WebBrowserTask
      myBrowserTask.Uri = New Uri(mySite, UriKind.Absolute)
      myBrowserTask.Show()
    Catch
      Exit Sub
    End Try
  End Sub
End Class
  • 「楽天Webサービスを利用したジャンル別商品検索」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

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

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

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

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