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?
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
systemcenterautomation.com a publié un blog à ce sujet . La conclusion:
Invoke-RestMethod
gère beaucoup mieux les résultats XML et JSON, tandis queInvoke-WebRequest
traite mieux les résultats HTML simples