連載 :
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」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。