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);