検索ロジックの作成
次に、ボタンクリックのイベントハンドラを実装して、実際に楽天WEB SERVICEを呼び出してみましょう。
SilverlightでHTTPリクエストを行う際には、WebClient
クラスか、HttpRequest
/HttpResponse
クラスを用いてリクエストを行うことができます。ここでは、WebClient
クラスのDownloadStringAsync
メソッドを利用してリクエストを行います。
[リスト7]は[リスト5]で行ったリクエストをプログラムで記述したものです。
private void Button_Click(object sender, RoutedEventArgs e) { // (1).リクエストURLの組み立て var apiAddress = "http://api.rakuten.co.jp/rws/1.13/rest"; var developerId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var operation = "ItemSearch"; var keyword = HttpUtility.UrlEncode(txtSearch.Text); var version = "2009-02-03"; var requestUri = string.Format( "{0}?developerId={1}&operation={2}&keyword={3}&version={4}", apiAddress, developerId, operation, keyword, version); var client = new WebClient(); // (2).ダウンロード完了時のイベントハンドラを登録 client.DownloadStringCompleted += RakutenDownloadStringCompleted; // (3).サービスのリクエスト client.DownloadStringAsync(new Uri(requestUri), null); } // (4).リクエスト内容の表示 private void RakutenDownloadStringCompleted( object sender, DownloadStringCompletedEventArgs e) { if (webEvent.Error != null) MessageBox.Show("通信エラー:" + webEvent.Error); else MessageBox.Show("結果:" + webEvent.Result); }
このプログラムは次の順序で動作します。
- リクエストURLの組み立て
- ダウンロード完了時のイベントハンドラを登録
- サービスのリクエスト
- リクエスト内容の表示
SilverlightのWebClient
クラスでもサービスリファレンスと同じように非同期リクエストのみのサポートになるため、リクエストの前に、ページの読み込みが終了タイミングで動作するイベントハンドラを登録してから、DownloadStringAsync
でGETリクエストを開始します。サービスリファレンスと同様にリクエストするURLが許可されていない場合はSystem.Security.SecurityException
が発生します。
[リスト8]は「4. リクエスト内容の表示」の部分を変更して、データグリッドに結果を表示するように変更した例です。
public class 商品 { public string 商品名 { get; set; } public string 価格 { get; set; } public string URL { get; set; } } // 4.リクエスト内容の表示 private void RakutenDownloadStringCompleted( object sender, DownloadStringCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.ToString()); return; } // (5).結果を解析して商品の一覧を作成する。 var xml = XElement.Parse(e.Result); var result = from item in xml.Descendants("Item") select new 商品 { 商品名 = item.Element("itemName").Value, 価格 = item.Element("itemPrice").Value, URL = item.Element("itemUrl").Value, }; 商品一覧.ItemsSource = result.ToList(); }
- 結果を解析して商品の一覧を作成する。
ここでは、Webサービスから取得したXMLを解析して、商品のリストを作成しています。楽天アイテム検索のページで出力XMLの形式を確認すると、Item要素以下に商品の一覧が格納されるため、LINQ to XMLを用いてItem要素以下のitemName、
itemPrice、
itemUrl
を取得し、商品クラスに格納しています。
その後、DataGridのItemsSource
に作成したリストを結びつけています。
この時に、LINQ to XMLの結果をそのままItemsSource
に代入すると、DataGridには何も表示されません。これはLINQ to XMLでは検索結果が必要になるまでリストの検索が実行されないためです。DataGridに結果を表示するためには、ItemsSource
の設定時に、ToList
メソッドで実体化させたリストを割り当てる必要があります。
その他のWebサービスにアクセスする場合
SilverlightのWebClient
では、基本認証がサポートされていません。また、前述のドメイン間ポリシーファイルで許可されているサイト以外にはアクセスできません。
筆者も最初はサンプルにTwitterクライアントを考えていたのですが、Twitterが基本認証を必要とすること、crossdomain.xmlで自サイト以外のアクセスを禁止していることから作成を断念しました。
このようなサービスを利用したい場合は、SilverlightをホストしているサイトにASP.NET WebServiceを作成し、サーバー側で必要なサービスに対しアクセスし、Silverlight側にはサーバー側でリクエストを行った結果をブリッジするような仕組みを考える必要があります。
まとめ
今回は、サービスリファレンスとWebClient
を使ったサーバーサービスとの連携について解説を行いました。Silverlightでは.NET Frameworkの機能が利用できるため、HTML+Javascriptでは実現できなかったクロスドメインや、複雑だったXMLの解析といった作業を簡単に行えることが理解いただけたのではないでしょうか。
Silverlightと言うと、動画やアニメーションなどのメディア方向ばかりに注目が集まっている感じがありますが、業務アプリケーションで利用する上では、.NET Frameworkの機能を利用してプログラムが作成できるというメリットこそが一番大きな特徴です。
ぜひもう一度この連載を確認してください。
Silverlightを業務アプリケーションで利用する際の助けになれればと願っています。