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

13542
James

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 nach dem, was ich tue, treffender benannt wird. Was ist der Unterschied und gibt es einen Grund, einen über den anderen zu verwenden?

18
[Invoke-RestMethod] (https://msdn.microsoft.com/de-de/powershell/reference/5.1/microsoft.powershell.utility/invoke-restmethod) hat einen anderen Parametersatz. Zusätzlich (immer etwas schwer zu sagen) wurde es wahrscheinlich in einer späteren PowerShell-Version eingeführt. Seth vor 7 Jahren 0
@Seth Beide wurden in Version 3 eingeführt. Dies ist auf den `Get-Help'-Seiten für beide Cmdlets zu finden. Ich würde spekulieren, dass Invoke-RestMethod zuerst technisch veröffentlicht wurde, da der Link "Online Version" in der "Get-Help" mit einer kleineren Zahl endet als auf der Seite "Invoke-WebRequest". root vor 7 Jahren 0

2 Antworten auf die Frage

20
Daniel B

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

Im Grunde geht Invoke-WebRequestes nicht darum, die Daten so viel zu analysieren. Mit -UseBasicParsingführt es einige Regex-basierte HTML-Analysen durch. Ohne diese Option wird die COM-API von Internet Explorer zum Analysieren des Dokuments verwendet.

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

Invoke-RestMethodAuf der anderen Seite steht Code zur Unterstützung von JSON- und XML-Inhalten zur Verfügung. Es wird versucht, einen geeigneten Decoder zu finden. HTML wird nicht unterstützt (mit Ausnahme von XML-konformem HTML natürlich).

Beide verwenden dieselbe Kernlogik, um die eigentliche HTTP-Anforderung auszuführen. Nur in der Ergebnisverarbeitung unterscheiden sie sich.

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 
1
Ohad Schneider

systemcenterautomation.com hat dazu einen Blog-Post geschrieben . Die Schlussfolgerung:

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