ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

HttpClient使ってみた

この前自作した、もっといえば基にしたneuccさんが作られたOAuthクライアントでも使っています。

これなん

HttpClient クラス (System.Net.Http)
.NET Framework 4.5でWebClientやHttpWebRequestに代わって新しく追加されたHTTPクライアントです。*1
System.Net.Httpを参照に追加すると使えるようになります。見つからない場合はNuGetにあります

ここがいい

今までのライブラリにあった不満がだいたい解決されていると思います。

エレガント

WebRequestのような泥臭い操作は一切なしにリクエストが投げられます。
POSTするときに文字列をバイト配列にしてペイロードのストリームを開けて…みたいな必要はありません。送信するコンテンツは抽象化されていて、しかも

HTTP のメッセージの内容は、RFC 2616 に定義されたエンティティ本体に対応します。
一部のクラスは、HTTP コンテンツに使用できます。 これらは次に示すとおりです。

  • ByteArrayContent バイト配列に基づいた HTTP コンテンツ。

FormUrlEncodedContent - application/x www フォーム urlencoded の MIME タイプを使用してエンコードされた名前と値の組の HTTP コンテンツ。

  • 取得MultipartContent HTTP コンテンツは multipart/* のコンテンツ タイプの仕様を使用してシリアル化されます。
  • MultipartFormDataContent multipart/form-data の MIME タイプを使用してエンコードされた HTTP コンテンツ。
  • StreamContent ストリームに基づいた HTTP コンテンツ。
  • StringContent 文字列に基づいた HTTP コンテンツ。
http://msdn.microsoft.com/ja-jp/library/system.net.http.httprequestmessage.content(v=vs.110).aspx:title ※一部改変

これらのクラスにパラメーターを渡すとよきに計らってくれます。

非同期通信できる

というか次節で示すメソッド名からわかる通り、非同期通信しかできません。async/awaitと組み合わせて使うこと前提の仕様ですね。返ってきた値のストリームや文字列を取り出すときもやっぱり非同期です。async/awaitと組み合わせてあげれば気分はこんな感じです。

もう何も恐くないのポーズ by なおのすけ on pixiv

RESTfull

用意されている通信メソッドは

  • GetAsync
  • PostAsync
  • PutAsync
  • DeleteAsync
  • SendAsync(何でもできる系のやつ)

とRESTfulです。最後のSendAsyncをつかうとTraceやHeadといったリクエストも送れます。

処理の細かい調整ができる

たとえばOAuthのように、全メッセージを通して必要なヘッダーがあるとかいったときに重宝します。

    public class OAuth2MessageHandler : DelegatingHandler
    {
        // 一部省略
        protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            // Authorizationヘッダー追加してる
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
            // そのほか必要なヘッダー追加してる
            foreach (var item in parameters) {
                request.Headers.Add(item.Key, item.Value);
            }

            return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
        }

こんな感じのを作っておいて、これのインスタンスをHttpClientのコンストラクターに渡してあげれば全部のリクエストに
Authorization: Bearer hogehoge
というリクエストヘッダーを付けられます。

*1:今までのクライアントが使えなくなったわけではない