次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト3のコードを記述します。
ロジックコードを記述する
リスト3 (MainWindow.xaml.vb)
クライアントとサーバーの両方で使用できる HTTP のコンポーネント(HTTP ヘッダー、およびメッセージなど)に関するクラスの含まれる、System.Net.Http名前空間をインポートします。
PtoductInfoクラス内に文字列型の「画像」、「商品名」、「価格」、「サイト」プロパティを定義しておきます。
1 | Public Class ProductInfo |
8 | Public NotInheritable Class MainPage |
楽天から取得したApplicationIDを定数メンバ変数として宣言します。
1 | ConstAppID As String = "楽天のApplicationID" |
XML要素を表すXElementクラス型のメンバ変数xmldocを宣言します。
選択した「ジャンル」を格納するメンバ変数selectGenreIDを宣言します。
1 | Dim selectGenreID As String |
ページがアクティブになった時の処理
XElement.LoadメソッドでXML文書ファイル(RakutenGenreId.xml)を読み込みます。
文字列型のリストである新しいtitleListオブジェクトを作成します。
Descendantsメソッドで全ての子孫要素であるに対して、各要素を変数resultに格納しながら、反復処理を行います。
titleListオブジェクトにAddメソッドで、要素の属性”title”の値を追加していきます。
ListBoxのItemsSourceプロパティにtitleListオブジェクトを指定します。
これで、リストボックスにジャンル名が表示されます。
1 | Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) |
2 | xmldoc = XElement.Load("RakutenGenreId.xml") |
3 | Dim titleList As New List(Of String) |
5 | For Each result In From c In xmldoc.Descendants("genreId") Select c |
6 | titleList.Add(result.Attribute("title").Value) |
8 | ListBox1.ItemsSource = titleList |
[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オブジェクトを指定します。検索結果の一覧が画像付きで、リストボックスに表示されます。
01 | Private Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click |
02 | Dim myKeyWord As String = Uri.EscapeDataString(searchTextBox.Text) |
03 | Dim mySort As String = Uri.EscapeDataString("+itemPrice") |
05 | Dim myHttpClient As New HttpClient |
06 | Dim myResponse = myHttpClient.GetStringAsync(New Uri(myUri, UriKind.Absolute)) |
07 | Dim myContent = myResponse.Result |
08 | Dim xmldoc As XElement = XElement.Parse(myContent) |
10 | Dim myProductInfo As New List(Of ProductInfo) |
11 | For Each result In From c In xmldoc.Descendants("Item") Select c |
13 | .Add(New ProductInfo With {.画像 = result.Element("mediumImageUrls").Value, |
14 | .商品名 = result.Element("itemName").Value, |
15 | .価格 = String.Format("{0:n0}円", Integer.Parse(result.Element("itemPrice").Value)), |
16 | .サイト = result.Element("itemUrl").Value}) |
19 | resultListBox.ItemsSource = myProductInfo |
ジャンルのリストボックスから項目が選択された時の処理
ListBox1の選択されたインデックスに該当する要素の値を取得して、メンバ変数selectGenreIDに格納します。
[OK]ボタンの使用を可能にします。
1 | Private Sub ListBox1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ListBox1.SelectionChanged |
2 | selectGenreID = xmldoc.Descendants("genreId")(ListBox1.SelectedIndex).Value |
3 | okButton.IsEnabled = True |
検索結果の一覧が表示されているリストボックスから、項目を選択した時の処理
リストボックスから選択した項目を、ProductInfoクラスにキャストして、「サイト」を取得し、変数mySiteに格納します。WebBrowserのNavigateメソッドで変数mySiteに格納されたURLに遷移します。
1 | Private Sub resultListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles resultListBox.SelectionChanged |
3 | Dim mySite As String = DirectCast(resultListBox.SelectedItem, ProductInfo).サイト |
4 | WebBrowser1.Navigate(New Uri(mySite, UriKind.Absolute)) |
今回はここまでです。ありがとうございました。