通信をハンドリングする
通常、HttpClientクラスによるHTTP通信はサーバー側からリダイレクトの応答を受け取った場合、指定されたURLを開きます。
自動的に指定されたURLを開くのではなく、リダイレクトの制御(ハンドリング)を行う方法を紹介します(HttpRequestSample_004.zip)。
サーバー側のコード
今回もサーバー側はPHPで記述します。コードは非常にシンプルです。
<?php // リダイレクトを行うサンプル header('Location: http://coelacanth.heteml.jp/sample/codezine/postsample.php'); ?>
アクセスが来たらpostsample.phpにリダイレクトを行う、というシンプルなコードです。
ストアアプリ側コード
ストアアプリ側は以下のようにリダイレクトをハンドリングします。
HttpClientHandler handler = new HttpClientHandler(); handler.AllowAutoRedirect = false; // 自動でリダイレクトさせない HttpClient client = new HttpClient(handler); String url = "http://coelacanth.heteml.jp/sample/codezine/redirectsample.php"; HttpResponseMessage message; String responseString; try { message = await client.GetAsync(url); // リダイレクトか判定 if (message.StatusCode == System.Net.HttpStatusCode.Found) { this.resultTextBox.Text = String.Format("リダイレクトが指定されましたURLは{0}です。", message.Headers.Location); } else { responseString = await message.Content.ReadAsStringAsync(); this.resultTextBox.Text = responseString; } } catch { // 例外が発生した場合の処理を記述していく }
HttpClientHandlerクラス
HTTP通信のハンドリングにはHttpClientHandlerクラスを用います。
今回はAllowAutoRedirectクラスにfalseを指定することで、自動でリダイレクトされることを制御しています。値をtrueに変更すると、サーバー側からリダイレクトの応答があった場合に自動でリダイレクトします。
HttpClientHandlerは、リダイレクトの制御以外にも認証やクッキーの制御にも利用できます。
HttpResponseMessage.StatusCodeプロパティ
通信結果のステータスコードが入ります。ステータスコードはHttpStatusCode列挙型の値が入ります。HttpStatusCodeについては以下のURLに一覧がありますので参考にしてみてください。
今回の場合はHttpStatusCode.Found、302リダイレクトの値が返されます。リダイレクト先のURLはHeaders.Locationプロパティで取得できます。
今回のサンプルを実行すると以下のような実行結果が表示されます。
まとめ
サーバーと連携する基本的な方法を紹介しました。
冒頭にも書いた通り、サーバーとの連携はストアアプリの世界を端末内から、世界中のユーザーと繋がる世界へと広げることができます。また、ストアアプリだけではなく、iPhoneやAndroidのアプリともデータを共有することが可能になります。
今回はサーバー側のコードとして簡単なPHPのサンプルを利用しましたが、本格的にサーバーを利用しようとするとデータベースやサーバーの知識が必要になってきます。色々覚えることが多く大変ですが、ぜひサーバーと連携させたストアアプリに挑戦してみてください。
次回は、RSSの取得やSNSとの連携、クラウド連携などのより実践的なテーマについて紹介する予定です。