次の方法で共有


Windows 8 ストアアプリ - 非同期なWebアクセスコーディング

WinRT APIでは非同期が導入されました。それに伴い、ファイルやネットアクセスなど時間がかかる処理は大抵の場合、メソッド名の最後にAsyncがついた、非同期メソッドになっています。

このポストでは、RESTなどで提供されているWebサービスへのアクセス方法を紹介します。例として、Twitterのアカウントのフォロワー情報を得るケース(今後OAuth認証が必要になりますが、2012年10月時点で許されている形式で紹介しますね)では、

https://api.twitter.com/1/statuses/followers/

 というURLを要求すると、(太字の部分は調べたいTwitterアカウントのuser_name)、XML形式で該当するTwitterアカウントのフォロワーの最初の100人分がXMLで返ってきます。

これをWindows 8 ストアアプリで実行するには、System.Net名前空間のWebRequest、WebResponseを使います。

    var followerUri = new Uri("https://api.twitter.com/1/statuses/followers/" + target + ".xml?" + "cursor=" + cursor);
    WebRequest twitterReq = WebRequest.Create(followerUri);
    try
    {
        var twitterRes = await twitterReq.GetResponseAsync();
        using (var stream = twitterRes.GetResponseStream())
        {
            …
        }
    }
    catch (Exception ex)
    {
        …
    }

WebRequest.Createメソッドを使って、リクエストインスタンスを作るのは、従来通りです。リクエストからレスポンスを取り出すには、上のアンダーラインを引いたような形式で書いて、WebResponseインスタンス(twitterRes)を取り出します。
twitterResを取れれば、後はGetResponseStream()メソッドをコールして、ストリームを取り出し、データを操作することができます。もちろん、Headersプロパティから応答ヘッダーの内容も参照可能です。

ネット上で公開されているREST APIを使って何かアプリを作りたい、と思っている方、是非お試しを

Comments

  • Anonymous
    October 08, 2012
    たとえば msdn.microsoft.com/.../hh868221.aspx のサンプルにあるように、 var twitterRes = await twitterReq.GetResponseAsync(); としてしまってよいのでは?

  • Anonymous
    October 08, 2012
    旧来の、APMパターンのBegin/Endの非同期メソッドしかない場合は、FromAsync()でラップしてTask<>を返すようにしてawaitを使い。Task<> XXXAsync()の形式で既に用意されている場合は、そっちを使うというのが良さそうな気がします。 ちなみに、Azure Storage Clientは、旧来のAPMパターンのメソッドしか用意されていないので、FromAsync()でラップする必要がありますが、パラメータが多くて面倒です。

  • Anonymous
    October 09, 2012
    コメントでのご指摘の通りですね。GetResponseAsync()の方がシンプルだし、新しく用意されたメソッドを使用するべきでしょう。 ということで、本文修正しておきました。念のため、修正前のコードをコメントに残しておきます。 [修正前] var twitterRes = await Task.Factory.FromAsync<WebResponse>(twitterReq.BeginGetResponse, twitterReq.EndGetResponse, null);