Twitter を眺めていると面白そうなのをみつけたので、自分ならどう書くか考えてました。
https://www.baku-dreameater.net/archives/8741#more-8741www.baku-dreameater.net
ただやるのでは楽しくないので、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を叩いてオブジェクトとして取得できます。が、そのままでは型が PSCustomObject
となりとてもつらくなります。これはクラスに結果を突っ込めば解消できるので、C# で取得したクラスをちょちょいと持ってくるか、JSON String をクラスに自動変換する何かを書けばいいでしょう。
ちなみに PasteJSONasPowerShell はダメです。PSCustomObject
にしちゃうのでこのケースでは意味を成しません。
ConvertToClass がいい感じでしょう。*1
WeatherHacksFunction.ps1
クラス構文がない PowerShell v4 では、C# クラスを Add-Type
するか、妥協して PSCustomObject
でどうぞ。
まとめ
API を一発叩くだけなら、PowerShell でもいいのですが、いかんせん非同期処理はコールバック地獄一直線なので、非同期処理するなら C# 一択です。
*1:Class 名が重複した場合の処理が入っていないのでIssueにあげてあります https://github.com/dfinke/ConvertToClass/issues/2