連載 :
Windows Phone Tips集楽天Webサービスを利用したジャンル別商品検索
2011年10月24日(月)

ロジックコードを記述する
リスト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サービスを利用したジャンル別商品検索」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。


