¿Cuál es la diferencia entre Invoke-WebRequest e Invoke-RestMethod?

24

Lo he estado utilizando Invoke-WebRequestcon éxito para publicar solicitudes en una API basada en REST de PowerShell.

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

Hoy me encontré con lo Invoke-RestMethodque suena más apropiado para lo que estoy haciendo. ¿Cuál es la diferencia, y hay alguna razón para usar una sobre la otra?

James
fuente
Invoke-RestMethod tiene un conjunto de parámetros diferente. Además (siempre un poco difícil de distinguir) probablemente se introdujo en una versión posterior de PowerShell.
Seth
1
@Seth Ambos se introdujeron en la versión 3. Esto se puede encontrar en las Get-Helppáginas de ambos cmdlets. Supongo que Invoke-RestMethodse publicó técnicamente primero, ya que el enlace "Versión en línea" Get-Helptermina con un número menor que el que se encuentra en Invoke-WebRequestla página.
root

Respuestas:

30

Puede averiguarlo descompilando el Microsoft.PowerShell.Commands.Utilityensamblaje.

Básicamente, Invoke-WebRequestno se trata de analizar mucho los datos. Con -UseBasicParsing, realiza un análisis HTML basado en Regex. Sin este modificador, usará la API COM de Internet Explorer para analizar el documento.

Eso es. Siempre intentará analizar HTML.

Invoke-RestMethodpor otro lado tiene código para soportar contenido JSON y XML. Intentará detectar un decodificador apropiado. No , no es compatible con HTML (a excepción de HTML compatible con XML, por supuesto).

Ambos comparten la misma lógica central para realizar la solicitud HTTP real. Es solo en el procesamiento de resultados que difieren.

¡Ver es creer!

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
fuente
4

systemcenterautomation.com hizo una publicación de blog sobre esto . La conclusión:

Invoke-RestMethodes mucho mejor en el manejo de resultados XML y JSON, mientras que Invoke-WebRequestes mejor en el manejo de resultados HTML directos

Ohad Schneider
fuente