36
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Invoke-WebRequestとInvoke-RestMethodの違い

Posted at

はじめに

「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 のが良いとも取れます。
そこは使用目的によるとしか言えませんね。
それでは!

36
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?