はじめに
「PowerShell API」 と検索すると多く出てくるのは Invoke-RestMethod
しかしさらに調べてみると Invoke-WebRequest なんてものも出てくる…
どう違うのか?しかしサッと調べてもあんまり出てこず…
本腰(言うほどでもないですが)入れて調査してみました。
結論:出力方法が違うため、向き不向きがある
参考にしたのはこちらの記事
Invoke-RestMethodはXMLとJSONの結果を扱うのがはるかに優れていますが、Invoke-WebRequestは単純なHTML結果を扱うのが優れています。
なるほど?しかし何故かという話がまだわからず…
と思ったら上記引用コメントの近くにブログへのリンクが
なるほど、そもそも応答が違うのか。
とりあえず自分でやってみる。
$rest = Invoke-RestMethod "https://yesno.wtf/api"
$web = Invoke-WebRequest "https://yesno.wtf/api"
APIはいつもの yes か No かを返すだけの API
ひとまず RestMethod をば。
$rest
answer forced image
------ ------ -----
yes False https://yesno.wtf/assets/yes/2-5df1b403f2654fa77559af1bf2332d7a.gif
次に WebRequest。
$web
StatusCode : 200
StatusDescription : OK
Content : {"answer":"yes","forced":false,"image":"https://yesno.wtf/assets/yes/1-af11222d8d4af90bdab8fc447c8cfe
bf.gif"}
RawContent : HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Status: 200 OK
Cache-Control: must-revalidate, max-age=0, private
Access-Control-Allow-Origin: *
ETag: "d5d1109b6aaeee4be8ce60e5846156…
Headers : {[Transfer-Encoding, System.String[]], [Connection, System.String[]], [Status, System.String[]], [Cac
he-Control, System.String[]]…}
Images : {}
InputFields : {}
Links : {}
RawContentLength : 109
RelationLink : {}
前述の通り、応答がガッツリ異なるようですね。
前者(RestMethod)は PowerShell 特有の PSObject という形ですね。
後者(WebRequest)はこのコマンドレット特有のものですね。
では、RestMethod のほうが何故 XML や JSON を扱いやすいのか?
とりあえずやってみようということで、先程の answer の値を取得してみましょう。
まずは RestMethod
$rest.answer
yes
次は WebRequest
$hoge = ConvertFrom-Json $web
$hoge.answer
yes
単純に手間が一つ少ないというだけではありますが、Json を扱うなら RestMethod が良さそうですね。
また、構造としてはどちらも同じらしく、出力のデータ形式が異なる以外の相違点はないそうです。
〆
というわけで結論は前述のとおりではありますが、ぶっちゃけどちらもあまり変わらない、というのが落としどころでしょうか。
ただどうなんでしょう、Content 以外を見るなら WebRequest のが良いとも取れます。
そこは使用目的によるとしか言えませんね。
それでは!