C#でRestSharpを利用する

HttpClientはいろいろあるらしい

外部のRestAPIを実行しようとしたときにC#であればHttpClientを利用するのがいいかと漠然と思っていたのですが、意外と罠が多いことを知りました。

.NETのHttpClientの取り扱いには要注意という話 - Qiita

確かにMSのサイトを見てもそのようにstaticで利用しています。

Create a REST client using .NET Core | Microsoft Docs

First you need an object that is capable to retrieve data from the web; you can use a HttpClient to do that. This object handles the request and the responses. Instantiate a single instance of that type in the Program class inside the Program.cs file.

もちろんDI側でSingletonにして渡せばいいのですが、WebClientを利用するためだけにそうするのもなぁと思いRestSharpを利用することにしました。

RestSharp - Simple REST and HTTP Client for .NET

最初はJavaでも利用していたUnirestを利用しようと思ったのですが、C#ではこちらのほうが人気なようでこちらにしました。

ちょっと引っかかった

このRestSharpはいい感じに利用できるのですが、少し困ったこともありました。RestAPIを実行するときにPostなどのメソッドではJsonをリクエストボディに設定すると思います。

このRestSharpはJsonにしたいオブジェクトを渡せばいい感じにJson文字列にして送信してくれるのですが、この時に利用しているSerealizer/DesirealizerがNewtonsoft.Json.JsonSerializerではないのです。

RestSharp/JsonDeserializer.cs at develop · restsharp/RestSharp

 private object FindRoot(string content)
 {
            object json = SimpleJson.SimpleJson.DeserializeObject(content);

            if (!RootElement.HasValue()) return json;

            if (!(json is IDictionary<string, object> dictionary)) return json;

            return dictionary.TryGetValue(RootElement, out var result) ? result : json;
}

その結果、プロパティ名が変換されず送信先で400エラーとなるという状況になりました。ただ、このJsonSerializerは変更可能なのでNewtonsoft.Json.JsonSerializerに変更してうまく利用できるようになりました。

このJsonSeralizerを変更する方法は下記の説明が分かりやすかったです。

Custom JSON Serializer and JSON Deserializer for RestSharp

おわりに

JavaでもC#でもデフォルトで提供されているライブラリをそのまま利用したいとは思うのですが、痒いところに手が届かないというかちょっとそのままでは大変なことがおおくて同じ機能を実現しているライブラリを探して利用するようにしています。

ただ、最初はどうしてもつまずくことが多くドキュメントに向き合いつつStackOverflowで同じような事象を探しつつすすめることでうまく行ってます。

速習ASP.NET Core 速習シリーズ

速習ASP.NET Core 速習シリーズ