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を使う)
この文字化けの話はまた今度。