背景
Windowsアプリ開発の中でHTTPクライアント周りを調べていたのですが、標準ではHttpClient
クラスが用意されています。
HttpClient クラス (System.Net.Http) | Microsoft Docs
が、このクラスが結構曲者らしいのです。(実際使ったことがないのでわかりませんが)
Qiitaで調べてみても結構出てきて、これは使いたくないな、、と正直思いました。
HttpClientをusingで囲わないでください - Qiita
.NET(Framework)のHttpClientの取り扱いには要注意という話 - Qiita
さらに調べたところ、RestSharpというREST APIクライアントライブラリがあることを知り、割と良さそうだと思ったので、Digest認証で試してみることにしました。
導入方法
NuGetパッケージの管理から以下のパッケージをインストールします。
- RestSharp
- RestSharp.Authenticators.Digest
- RestSharp.Serializers.Utf8Json
Install-Package RestSharp
Install-Package RestSharp.Authenticators.Digest
Install-Package RestSharp.Serializers.Utf8Json
使い方
例えばAPIがGETメソッドで、レスポンスとして以下のJSONデータを返してくるものとします。
{"foo": "bar", "baz": {"foo": "bar", "baz": "qux"}}
まず、JSONデータを受け取るためのデータクラスを作成します。
public class Foo
{
public string foo { get; set; }
public Baz baz { get; set; }
}
public class Baz
{
public string foo { get; set; }
public string baz { get; set; }
}
そして、以下のようにリクエスト&レスポンスからJSONデータをデシリアライズします。
// クライアントの生成(BaseURLを設定しておく)
var client = new RestClient("https://hogehoge.api/1.1)
{
// Digest認証の設定
Authenticator = new DigestAuthenticator("username", "password");
};
// JSONシリアライザーの設定(今回はUtf8Jsonを使用)
client.UseUtf8Json();
// リクエストの生成(Resourceとレスポンスのデータフォーマットを設定)
var request = new RestRequest("foobaz", DataFormat.Json);
// 同期呼び出し
var response = client.Get(request);
// JSONデータをデシリアライズ
var result = new Utf8JsonSerializer().Deserialize<Foo>(response);
大まかにはRestClient
クラスのインスタンスを生成し、認証方式やJSONシリアライザーの設定をして、RestRequest
クラスのインスタンスをclient.Get
メソッドの引数に渡すことでできます。
そして、変数response
に結果が入っているので、あとはJSONデータをデシリアライズします。
また、以下のように非同期呼び出しにして、デシリアライズをまとめることもできます。
// 非同期呼び出し(resultがFoo型として返ってくる)
var result = await client.GetAsync<Foo>(request);