Was ist der Unterschied zwischen Invoke-WebRequest und Invoke-RestMethod?

24

Ich habe erfolgreich verwendet Invoke-WebRequest, um Anforderungen von PowerShell an eine REST-basierte API zu senden.

Invoke-WebRequest -UseBasicParsing https://my-rest-api.com/endpoint -ContentType "application/json" -Method POST -Body $json

Heute bin ich auf Invoke-RestMethodetwas gestoßen, das für das, was ich tue, treffender benannt klingt. Was ist der Unterschied, und gibt es einen Grund, einen über den anderen zu setzen?

James
quelle
Invoke-RestMethod hat einen anderen Parametersatz. Außerdem (immer etwas schwer zu sagen) wurde es wahrscheinlich in einer späteren PowerShell-Version eingeführt.
Seth
1
@Seth Beide wurden in Version 3 eingeführt. Diese finden Sie auf den Get-HelpSeiten für beide Cmdlets. Ich würde spekulieren, dass dies zuerst Invoke-RestMethodtechnisch veröffentlicht wurde, da der Link "Online-Version" am Get-HelpEnde mit einer kleineren Zahl als der auf Invoke-WebRequestder Seite gefundenen endet .
root

Antworten:

30

Sie können dies herausfinden, indem Sie die Microsoft.PowerShell.Commands.UtilityAssembly dekompilieren .

Grundsätzlich geht Invoke-WebRequestes nicht darum, die Daten so oft zu analysieren. Mit -UseBasicParsingwird ein Regex-basiertes HTML-Parsing durchgeführt. Ohne diese Option wird die COM-API von Internet Explorer zum Parsen des Dokuments verwendet.

Das ist es. Es wird immer versucht, HTML zu analysieren.

Invoke-RestMethodAuf der anderen Seite gibt es Code zur Unterstützung von JSON- und XML-Inhalten. Es wird versucht, einen geeigneten Decoder zu finden. HTML wird nicht unterstützt (außer natürlich XML-konformes HTML).

Beide verwenden dieselbe Kernlogik, um die eigentliche HTTP-Anfrage zu stellen. Sie unterscheiden sich nur in der Ergebnisverarbeitung.

Sehen heißt glauben!

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
Daniel B
quelle
4

systemcenterautomation.com hat einen Blog-Beitrag dazu verfasst . Das Fazit:

Invoke-RestMethodist viel besser im Umgang mit XML- und JSON-Ergebnissen, während Invoke-WebRequestes besser im Umgang mit reinen HTML-Ergebnissen ist

Ohad Schneider
quelle