web-dev-qa-db-fra.com

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

J'ai utilisé avec succès Invoke-WebRequest pour envoyer des demandes à une API basée sur REST à partir 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-RestMethod, qui sonne de manière plus appropriée. Quelle est la différence et y a-t-il une raison pour utiliser l'un sur l'autre?

24
James

Vous pouvez le savoir en décompilant l'assembly Microsoft.PowerShell.Commands.Utility.

Invoke-WebRequest ne 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 Internet Explorer COM pour analyser le document.

C'est tout. Il essaiera toujours d’analyser le HTML.

Invoke-RestMethod a d'autre part un code pour supporter le contenu JSON et XML. Il essaiera de détecter un décodeur approprié. Not 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. C’est uniquement dans le traitement des résultats qu’elles 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
27
Daniel B

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

Invoke-RestMethod gère beaucoup mieux les résultats XML et JSON, tandis que Invoke-WebRequest traite mieux les résultats HTML simples

4
Ohad Schneider