Quelle est la différence entre Invoke-WebRequest et Invoke-RestMethod?

24

J'ai utilisé avec succès Invoke-WebRequestpour publier des demandes vers une API basée sur REST de PowerShell.

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

Aujourd'hui, je suis tombé sur Invoke-RestMethodce qui semble plus bien nommé pour ce que je fais. Quelle est la différence et y a-t-il une raison d'utiliser l'un sur l'autre?

James
la source
Invoke-RestMethod a un jeu de paramètres différent. De plus (toujours un peu difficile à dire), il a probablement été introduit dans une version ultérieure de PowerShell.
Seth
1
@Seth Both a été introduit dans la version 3. Cela se trouve sur les Get-Helppages des deux applets de commande. Je suppose que cela a Invoke-RestMethodété techniquement publié en premier, car le lien "Version en ligne" Get-Helpse termine par un nombre plus petit que celui trouvé sur Invoke-WebRequestla page de.
root

Réponses:

30

Vous pouvez le découvrir en décompilant l' Microsoft.PowerShell.Commands.Utilityassembly.

Fondamentalement, Invoke-WebRequestne traite pas beaucoup de l'analyse des données. Avec -UseBasicParsing, il effectue une analyse HTML basée sur Regex. Sans ce commutateur, il utilisera l'API COM d'Internet Explorer pour analyser le document.

C'est ça. Il essaiera toujours d'analyser le HTML.

Invoke-RestMethodd'autre part, a du code pour prendre en charge le contenu JSON et XML. Il tentera de détecter un décodeur approprié. Il ne prend pas en charge le HTML (sauf pour le HTML compatible XML, bien sûr).

Les deux partagent la même logique de base pour effectuer la demande HTTP réelle. Ce n'est que dans le traitement des résultats qu'ils diffèrent.

Voir c'est croire!

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
la source
4

systemcenterautomation.com a publié un blog à ce sujet . La conclusion:

Invoke-RestMethodest bien meilleur pour traiter les résultats XML et JSON, alors qu'il Invoke-WebRequestest meilleur pour traiter les résultats HTML simples

Ohad Schneider
la source