PowerShellのRESTベースのAPIにリクエストを投稿するためにInvoke-WebRequest
を使用しました。
Invoke-WebRequest -UseBasicParsing https://my-rest-api.com/endpoint -ContentType "application/json" -Method POST -Body $json
今日、私はInvoke-RestMethod
に出くわしました。違いは何ですか?また一方を他方に使用する理由はありますか?
Microsoft.PowerShell.Commands.Utility
アセンブリを逆コンパイルするとわかります。
基本的に、Invoke-WebRequest
はそれほどデータの解析を行いません。 -UseBasicParsing
を使うと、RegexベースのHTML解析を行います。このスイッチがなければ、Internet Explorer COM APIを使ってドキュメントを解析します。
それでおしまい。常にHTMLを解析しようとします。
一方Invoke-RestMethod
にはJSONとXMLコンテンツをサポートするコードがあります。適切なデコーダを検出しようとします。 HTMLをサポートしません(もちろんXML準拠のHTMLを除く)。
両方とも、実際のHTTPリクエストを作成するための同じコアロジックを共有しています。違いがあるのは結果処理だけです。
百聞は一見に如かず!
PS C:\Users\fuzzy> (Invoke-RestMethod https://httpbin.org/headers).headers
Connection Host User-Agent
---------- ---- ----------
close httpbin.org Mozilla/5.0 (Windows NT; Windows NT 10.0; de-DE) WindowsPowerShell/5.1.15063.483
PS C:\Users\fuzzy> Invoke-WebRequest -UseBasicParsing https://httpbin.org/headers
StatusCode : 200
StatusDescription : OK
Content : {
"headers": {
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT; Windows NT 10.0; de-DE)
WindowsPowerShell/5.1.15063.483"
}
}
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Processed-Time: 0.00075101852417
Content-Length: 180
Content-Type: application/json...
Forms :
Headers : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,
true], [X-Processed-Time, 0.00075101852417]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml :
RawContentLength : 180
systemcenterautomation.comがこれについて ブログ記事を作成しました 。結論:
Invoke-RestMethod
はXMLとJSONの結果を扱うのがはるかに優れていますが、Invoke-WebRequest
は単純なHTML結果を扱うのが優れています。