Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Silverlightとサーバーサービスの連携

Silverlight 2で作成する業務アプリケーション入門(6)

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

検索ロジックの作成

 次に、ボタンクリックのイベントハンドラを実装して、実際に楽天WEB SERVICEを呼び出してみましょう。

 SilverlightでHTTPリクエストを行う際には、WebClientクラスか、HttpRequest/HttpResponseクラスを用いてリクエストを行うことができます。ここでは、WebClientクラスのDownloadStringAsyncメソッドを利用してリクエストを行います。

 [リスト7]は[リスト5]で行ったリクエストをプログラムで記述したものです。

[リスト7]楽天アイテム検索APIの呼び出し(Page.xaml.cs)
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);
}

 このプログラムは次の順序で動作します。

  1. リクエストURLの組み立て
  2. ダウンロード完了時のイベントハンドラを登録
  3. サービスのリクエスト
  4. リクエスト内容の表示

 SilverlightのWebClientクラスでもサービスリファレンスと同じように非同期リクエストのみのサポートになるため、リクエストの前に、ページの読み込みが終了タイミングで動作するイベントハンドラを登録してから、DownloadStringAsyncでGETリクエストを開始します。サービスリファレンスと同様にリクエストするURLが許可されていない場合はSystem.Security.SecurityExceptionが発生します。

 [リスト8]は「4. リクエスト内容の表示」の部分を変更して、データグリッドに結果を表示するように変更した例です。

[リスト8]データグリッドに結果データの表示(Page.xaml.cs)
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();
}
  1. 結果を解析して商品の一覧を作成する。

 ここでは、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を業務アプリケーションで利用する際の助けになれればと願っています。

参考資料



  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

  • WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

バックナンバー

連載:Silverlight 2で作成する業務アプリケーション入門
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5