Qual è la differenza tra Invoke-WebRequest e Invoke-RestMethod?


24

Ho usato con successo Invoke-WebRequestper inviare richieste a un'API basata su REST da PowerShell.

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

Oggi mi sono imbattuto in quello Invoke-RestMethodche suona in modo più appropriato per quello che sto facendo. Qual è la differenza e c'è un motivo per usarne uno rispetto all'altro?


Invoke-RestMethod ha un set di parametri diverso. Inoltre (sempre un po 'difficile da dire) è stato probabilmente introdotto in una versione successiva di PowerShell.
Seth,

1
@Seth Entrambi sono stati introdotti nella versione 3. Questo può essere trovato nelle Get-Helppagine di entrambi i cmdlet. Immagino che sia Invoke-RestMethodstato tecnicamente pubblicato per primo, poiché il link "Versione online" Get-Helptermina con un numero inferiore a quello trovato sulla Invoke-WebRequestpagina.
radice

Risposte:


30

Puoi scoprirlo decompilando l' Microsoft.PowerShell.Commands.Utilityassembly.

Fondamentalmente, Invoke-WebRequestnon si occupa di analizzare i dati così tanto. Con -UseBasicParsing, esegue alcune analisi HTML basate su Regex. Senza questa opzione, utilizzerà l'API COM di Internet Explorer per analizzare il documento.

Questo è tutto. Tenterà sempre di analizzare HTML.

Invoke-RestMethodd'altra parte ha il codice per supportare il contenuto JSON e XML. Tenterà di rilevare un decodificatore appropriato. Esso non supporta il formato HTML (ad eccezione di XML-compliant HTML, ovviamente).

Entrambi condividono la stessa logica di base per effettuare la richiesta HTTP effettiva. È solo nell'elaborazione dei risultati che differiscono.

Vedere per credere!

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

4

systemcenterautomation.com ha pubblicato un post su questo blog . La conclusione:

Invoke-RestMethodè molto più bravo a gestire i risultati XML e JSON, mentre Invoke-WebRequestè più bravo a gestire i risultati HTML diretti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.