WebClientを使ったHTTPリクエストあれこれ

Beta 2 になってからHttpWebRequestを使わなくてもWebClientだけである程度*1のHTTPリクエストができるようになったので、まとめておく。

GET

まずはGETから。

var wc = new WebClient();
wc.DownloadStringCompleted += (s, e) => {
  if(e.Error == null) {
      var result = e.Result;
      // Do Something
  } else {
      // エラー処理
  }
};
wc.DownloadStringAsync(new Uri("http://hoge.com/get"));

GET操作はDonwloadStringAsyncメソッドを使って行う、このメソッドは非同期で実行されるので、結果はDownloadStringCompletedイベントで受け取る。

POST - FORMデータ

次はPOST、FORMデータを渡す場合。

var wc = new WebClient();
wc.Encoding = Encoding.UTF8;
wc.Headers["content-type"] = "application/x-www-form-urlencoded";
wc.UploadStringCompleted += (s, e) => {
  if(e.Error == null) {
      var result = e.Result;
      // Do Something
  } else {
      // エラー処理
  }
};
wc.UploadStringAsync(new Uri("http://hoge.com/post"), "POST", "id=1&name=hoge");

UploadStringAsyncメソッドはHTTPメソッド名を指定できるので、これを使ってPOSTリクエストを行う。また、第三引数にFORMデータを渡すことができる。このメソッドも非同期で実行されるので、結果はUploadStringCompletedイベントで受け取る。

POST - リクエストStream

FORMデータではなく、リクエストStreamに直接書き込む場合。

var wc = new WebClient();
wc.OpenWriteCompleted += (s, e) => {
  if(e.Error == null) {
      var buf = Encoding.UTF8.GetBytes(content);

      e.Result.Write(buf, 0, buf.Length);
      e.Result.Close();
        
  } else {
      // エラー処理
  }
};
wc.OpenWriteAsync(new Uri("http://hoge.com/post"), "POST");

これにはOpenWriteAsyncメソッドを使う。OpenWriteCompletedイベントでストリームを取得するこができるので、そこに書き込んでやればいい。

でも、この方法でリクエストを送るとレスポンスを取得することができない(できるかもしれないけど、やり方がわからない)。

この他のHTTPメソッド(PUT、DELETEなど)はサポートされていない(メソッド名に指定するとエラーが返ってくる)。

WebClientでPOSTメソッドがサポートされたので、HttpWebRequestを使うよりも少しだけ簡潔に書くことができるようになった。まぁ細かいことをしようと思うと結局HttpWebRequestを使う必要が出てくるけど、大抵のことはWebClientだけでできると思う。

*1:Beta 1では単純なGETしかできなかった