SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

検索ロジックの作成

 次に、ボタンクリックのイベントハンドラを実装して、実際に楽天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を業務アプリケーションで利用する際の助けになれればと願っています。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight 2で作成する業務アプリケーション入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3596 2009/02/24 14:01

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング