Twitterを眺めていると面白そうなのをみつけたので、自分ならどう書くか考えてました。
ただやるのでは楽しくないので、PowerShellとの比較です。
コードサンプル
素直だったので、てきとーにいきましょう。エラーハンドルはここではしていません。
4つ用意しました。
WeatherHacks.cs
元との違いはHttpClient使ってることぐらいです。サクッとデータ取るにはいいのです。
WeatherHacksClass.cs
JSONをいちいちパースするのがつらいので、普段はクラスとして一気にデシリアライズしています。
Visual Studio2013以降はJSON Stringを貼り付けるときに、自動的にクラス変換する機能があります。そこで、適当にPowerShellやLINQPadで取得したJSONをクリップボードにコピーして、VS2015で貼り付けるだけでクラスが生成できます。
あとは普通です。
WeatherHacksClass.ps1
PowerShell v5のクラス構文でC# に近いコードの再現例です。
PowerShellではInvoke-RestMethod
Cmdletで超お手軽簡単にAPIを叩いてオブジェクトとして取得できます。が、そのままでは型がInvoke-RestMethod
となりとてもつらくなります。これはクラスに結果を突っ込めば解消できるので、C# で取得したクラスをちょちょいと持ってくるか、JSON Stringをクラスに自動変換する何かを書けばいいでしょう。
ちなみにPasteJSONasPowerShellはダメです。PSCustomObject
にしちゃうのでこのケースでは意味を成しません。
ConvertToClassがいい感じでしょう。*1
WeatherHacksFunction.ps1
クラス構文がないPowerShell 4.0では、C# クラスをAdd-Type
するか、妥協してAdd-Type
でどうぞ。
まとめ
APIを一発叩くだけなら、PowerShellでもいいのですが、いかんせん非同期処理はコールバック地獄一直線なので、非同期処理するならC# 一択です。
*1:Class名が重複した場合の処理が入っていないのでIssueにあげてありますhttps://github.com/dfinke/ConvertToClass/issues/2