Windows 8 Store Applicationプログラミング(応用編) 8

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

次に、ソリューションエクスプローラー内の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メソッドで全ての子孫要素であるに対して、各要素を変数resultに格納しながら、反復処理を行います。
titleListオブジェクトにAddメソッドで、要素の属性”title”の値を追加していきます。
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メソッドで全ての子孫要素に対して、要素の内容を変数resultに格納しながら、反復処理を行います。

新しい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の選択されたインデックスに該当する要素の値を取得して、メンバ変数selectGenreIDに格納します。
[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

今回はここまでです。ありがとうございました。

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る