BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

C# HttpClient の小ネタ(Content-Type、Basic / OAuth2 認証とか)

C# ビギナー向けネタとして、以下のHttpClient のTipsを整理です。Content-Type で application/json どこに設定すんねーんとかですね。

2017年はかなり昔なので一応追記しておくと、時代は進むものです。

blog.beachside.dev

さて本題です。

Content-Typeの設定

以外とはまってる人を見かけるのが、リクエストのcontent-type になんか設定したいときです。例として、text/xmlをセットするコードです。

var client = new HttpClient();
client.DefaultRequestHeaders
      .Accept
      .Add(new MediaTypeWithQualityHeaderValue("text/xml"));

そこかーい!ってなりますね。微妙な気もしますし、HttpClientのデータ構造をみれば「だよね」ってなるやーつです。

HttpClientクラスの中にDefaultRequestHeadersプロパティ(HttpRequestHeaders 型)ってのがあり、その中のAcceptプロパティ(HttpHeaderValueCollection型)に値をセットする必要があるってわかると、上記のようなアクセスを想像できますね。

上のやり方が基本的なところだと感じてますが、「あれ?動かない?」とかありますでしょうか。
どう使うか次第なのでちゃんとドキュメント読みましょうって話にはなりますが、Postする際に使う StringContent に埋め込むとかもできます。テキトーに書くとこんな感じです。

var url = "送信先の url.."
var payload = "送信する payload";

var content = new StringContent(payload, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync(url, content);

StringContent のコンストラクターの公式ドキュメントは貼っておきます。

認証関連

よくありそなBasic認証と、OAuth2を。

認証自体の仕様を理解すると簡単な気がします。その仕様は、HTTP 認証 - HTTP | MDN あたりで確認するのがよいでしょうか。

Basic認証

認証スキーマをざっくりいうと、 「userIdとpassword をBase64エンコードして送信してくり」です。 これをHttpClient で実装すると以下の感じです。

public class HttpClientAuthDemo
{
    private HttpClient _client;

    public HttpClientAuthDemo(HttpClient client)
    {
        _client = client;
    }

    public async Task BasicAuthDemoAsync(string userId, string password)
    {
        var parameter = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userId}:{password}"));
        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", parameter);

        Console.WriteLine();
        // 送信処理...(略)

    }
}

HttpClient は、前回テストの話をした流れでなんとなくクラスのコンストラクターで渡してます。

で、値をセットするだけです。

base64エンコードしてあげる際のbyte[]は、ASCIIで?とかな論争ありましたっけか...なんかあったようなきもしますが調べる気はないので、ここでは(自分の動いてるコードからとってきた)UTF8でエンコードのサンプルを載せています。

OAuth2認証

ざっくりな認証スキーマは、「bearerトークン送ってけろ」です。どーにかしてbearerトークンを取得した後の設定方法のサンプルです。

public class HttpClientAuthDemo
{
    private HttpClient _client;

    public HttpClientAuthDemo(HttpClient client)
    {
        _client = client;
    }

    public async Task OAuth2DemoAsync(string bearerToken)
    {
        _client.DefaultRequestHeaders.Add("Authorization", bearerToken);

        Console.WriteLine();
        // 送信処理...(略)
           
    }
}

HttpCientにトークンをセットしてあげるだけです。bearerトークンは、Bearer という文字の後にスペースが1つ、でそのあとにトークンをっていう仕様です。

ちなみにBasic認証は、Basic という文字の後にスペースが1つ、でエンコードした文字列がくるって仕様です。

Basic認証とOAuth2で、HttpClientのHeaderへのセット方法をあえて変えましたが、認証の仕様とメソッドの動作を理解しておけばどちらの方法でも設定可能です。


便利拡張メソッド

最後にHttpClient の意外と知られていない?便利な拡張メソッドのネタです。

HttpClientの拡張メソッドとして用意されているやつなので、System.Net.Http.Formatting.dllを参照するか、Nugetで、System.Net.Http.Formatting.Extensionを取得して使う必要があります♪

個人的なお気に入りは PostAsJsonAsyncReadAsAsync<T> です。これを使うとコードが数行減るだけですが、使い勝手がいいので好きです。

ただ、依存関係が、System.Net.Httpに対して「.NETFramework, Version=v4.0」ってのが微妙なところ...

.NET Core側で実装しないのかなー...と思っているところですが見てもいないです....

ここで言いたかったことは、こういうプチ便利拡張メソッドは、なければ自分でも簡単に作れるから用意すればいいよねってことでした。

おわりに

前回もリンクつけたんですが、ビギナーの方にはぜひ知っておきたい記事。

開発者を苦しめる.NETのHttpClientのバグと紛らわしいドキュメント

おしまい