PowerShellでAPIをたたくプログラムを作っています。
今回は、タイトルにある通り、

  • Invoke-WebRequest
  • Invoke-RestMethod

についてまとめます。


参考にしたのはこちら。

windows — Invoke-WebRequestとInvoke-RestMethodの違いは何ですか? (web-dev-qa-db-ja.com)
Invoke-WebRequestとInvoke-RestMethodの違い - Qiita

これは叩くと一目瞭然で、レスポンスが全然違う。

まずはInvoke-WebRequestから。
headerにベーシック認証の情報を持たせてるのと、-UseBasicParsingパラメータを付与すると、IEエンジンを使わずごく基本的なパースのみ行う(PowerShellでスクレイピング 後編 HTMLをパースする - PowerShell Scripting Weblog (winscript.jp))…まあおまじないです。


$res1 =  Invoke-WebRequest `
					    -Uri "https://hogehoge.com" `
					    -Headers @{ `
						    "Authorization" = "Basic " + $token `
						    } `
						  -UseBasicParsing

さて、$res1を展開してみましょう。

StatusCode        : 200
StatusDescription : OK
Content           : {...}
RawContent        : HTTP/1.1 200 OK
                    Referrer-Policy: origin
                    X-Content-Type-Options: nosniff
                    X-ORACLE-DMS-RID: 0:3
                    Link: <...
Headers           : {[Referrer-Policy, origin], [X-Content-Type-Options, nosniff], [X-ORACLE-DMS-RID, 0:3], [Link, <>;rel="self";kind="collection";name=""]...}
RawContentLength  : 2500

次にInvoke-RestMethod

$res2 =  Invoke-RestMethod `
					    -Uri "https://hogehoge.com" `
					    -Headers @{ `
						    "Authorization" = "Basic " + $token `
						    } `
              -UseBasicParsing

$res2を展開すると。

items   : {@{StartDate=2022-10-26; EndDate=4712-12-31; links=System.Object[]}}
count   : 3
hasMore : False
limit   : 25
offset  : 0
links   : {...}

$res2、すなわちInvoke-RestMethodのほうがすっきりしています。
$res1のContent部分を抜き出して出力するのが、Invoke-RestMethodです。

使い分け

じゃあどうやって使い分けるか?
個人的な結論としては

  • Contentだけほしい→RestMethod
  • Statusとか、Content以外もほしい→WebRequest

なんですけど、ここで注意点があって……
場合によっては、日本語が含まれてるとContentが文字化けするんですよね……
(APIの提供元によると思います)

となると、文字コードを指定だとか、エンコードだとかデコードだとか…。
そういうときは、Invoke-WebRequestの方を使います。(RestMethodは変換後データなので、元データのWebRequestを使う)
この文字化けの話はまた今度。