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のバグと紛らわしいドキュメント

おしまい

C# HttpClient の Mock でFake のレスポンスを返す in 単体テスト

単体テストでHttpClient のMock的なので Fakeなレスポンスを返す時の方法のメモ(..というか聞かれたので答えた内容書いたってお話です。)

今回の単体テストする対象クラスは以下の想定です。

  • とあるビジネスロジックがあるクラスの中に HttpClient がいて、それ使って外部のWebAPIを呼んでる
  • 単体テストだから外部のWebAPIのレスポンスなんて正しいものが来る前提でテストするよね
続きを読む

AWS Lambda を .Net Core と ( .NET Standard と) C# で実装する(その2)

前回から引き続き、 AWS Lambda を C# で、.NET Core 1.0、.NET Standard 1.6 を使って実装する際のメモです。 Autofac 使ってDIをする話がメインです。

(2017/9月時点での話=.NET Core 1.0しかサポートしてない時点です)

Overview

 1 開発環境の準備 (その1)
 2 .NET Core 1.0 対応の .NET Standard 1.6 のクラスライブラリの作成(その1)
 3 簡易なクラスライブラリー実装(その1)
 4 Console プロジェクトの作成 (←今回ココから)
 5 Autofac の実装
 6 AWS Labmda プロジェクトの作成
 7 AWS Labmda の環境変数を読み込む
 8 AWS API Gateway から Lambda - プロキシ統合 の使用とか
 9 AWS Lambda から AWS Lambda の呼び出し
 10 AWS Lambda から CloudWatch Events の呼び出し

続きを読む

Bot Framework で State を CosmosDB ( DocumenDB ) に保存する - C#

Bot Framework の State を CosmosDB に保存する方法のメモです。

前回、State を 安価な Table Storage に保存しましたが、多少使いにくかったり遅かったりします。その対極(?)、高価で使いやすくて速い CosmosDB のターンです。
(個人的感覚です)

今回は、Azure ポータルで CosmosDB を作って、アプリと繋いで確認という流れで進めます。

続きを読む

Bot Framework での 状態管理(state service の概要を整理)

Bot Framework での ステート管理 について、以下のドキュメントのざっくりな個人的まとめメモです。

docs.microsoft.com

Overview

続きを読む

チャットボットの会話のログを Table Storage に出力( Bot Framework )

今回は Azure の Table Storage に、チャットボットの会話のやり取りをロギングする方法を整理します。

前回は、ログ出力の重要な要素、IActivityLogger インターフェースについて概要を整理しました。それを応用して…と言いたいところですが、Nuget で用意されているライブラリを使うだけで簡単に実現できます。

https://www.nuget.org/packages/Microsoft.Bot.Builder.Azure/

Overview

続きを読む

Bot Framework のメッセージ を ログ するための IActivityLogger ( C# ) の概要

ボットとユーザーの会話のロギングに便利な IActivityLogger インターフェースのメモです。

まず最初にまとめですが、IActivityLogger インターフェースを実装したログの出力クラスを定義しておけば、ボットがメッセージを受け取ったときや送信したときに、その内容をログをはいてくれます。

基本的なところのメモです。さっそくC#で実装して動作を見てみます♪

続きを読む

グローバルメッセージハンドラー (2/2) - Bot Frameworkの基本機能 (global message handlers using Scorables)

前回から引き続き、本題の Scorables の実装です。

Overview

続きを読む

グローバルメッセージハンドラー (1/2) - Bot Frameworkの基本機能 (global message handlers using Scorables)

Bot Framework で開発するときに使うであろう基本機能、Scoralbles をC#で実装関連のメモです。
通称(?)global message handler でドキュメントやGitHubに載っていて、Scorables を使って実装するやーつです。

Overview

続きを読む

.NET Core と xUnit でライブユニットテスト(的なやつ)

Visual Studio 2017のEnterprise限定のライブユニットテストの話ではなく、VS2017であればどのバージョンでも(たぶん)使えるライブなユニットテスト(的なやつ)です。

Microsoft.DotNet.Watcher.Toolsを使い、コマンドプロンプトでwatchしてtest結果を見る感じなので、ライブユニットテストほどUIは良くないですが楽しめます♪

今回は、.NET Coreのクラスライブラリを作り、xUnitのテストのプロジェクトでテストをライブします。

Overview

続きを読む