httpのGETを行う


通信で凝ったことを行おうとしたり、ファイルのダウンロードを行うなど、そういった場面でよく使われるのがHTTPでのGETやPOSTなどを使って行います。

socketを使ってHTTPのGETリクエストを出す場合はたくさんの手順を踏まなければなりません。
ソケットを生成して接続して特定のメッセージを送ってレスポンスを確認してなどなど

WindowsPhone7ではすでにそういったこと非同期でしてくれる便利なクラスが用意されています。

そこで今回はWindowsPhone7でHTTPのGETを行うWebClientについてご紹介します。

WebClient

まずはWebClientクラスを生成し、発行したいHTTPリクエストを生成します。
今回は単純にgoogleのTOPページのアドレスを指定するGetリクエストを準備します。
アドレスを指定してGETリクエストを出すにはOpenReadAsyncの引数にURIを指定するとHTTPのGETリクエストを行います。

WebClient webClient = new WebClient();
Uri uri = new Uri("http://www.google.com", UriKind.Absolute);
webClient.OpenReadAsync(uri);

ここで注意しなければならないのはWebClientは非同期で動作を行います。
OpenReadAsyncを実行すると別のスレッド処理され指定URIからのデータを取得し全データの受信が完了するとイベントを発生してくれます。
そのためイベントが発生した際にコールバックされるメソッドを用意、設定を行うことで受信後の処理を行うことができます。

受信後に呼ばれるコールバックではOpenReadCompletedEventArgsが受信結果として得られます。
OpenReadCompletedEventArgsの下記のプロパティを持っています。

[table “237” not found /]

実際に受信後の処理を行う場合は以下のようになります。

        private void onBinaryLoad(object sender, OpenReadCompletedEventArgs e)
        {
            if ((e.Error != null) || (e.Cancelled))
            {
                // キャンセルやエラー
                // エラー処理等はこちらで
            }
            else
            {
                var result = new StreamReader(e.Result);
                // テキストブロックに吐き出す場合
                textBlock1.Text = result.ReadToEnd();
            }
        }

今回は得られたHTMLデータをテキストブロックに表示しています。

最後にHTTPのGETに対して処理が完了したことを通知するイベントが発生した際に上記のonBinaryLoadメソッドを呼び出すように設定します。

webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(onBinaryLoad);

これで特定のURLに対してHTTPのGETを行い、データの受信が完了した時にonBinaryLoadメソッドが呼びされます。