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で同じような事象を探しつつすすめることでうまく行ってます。
- 作者: 山田祥寛
- 出版社/メーカー: WINGSプロジェクト
- 発売日: 2017/12/04
- メディア: Kindle版
- この商品を含むブログを見る