Qual é a diferença entre Invoke-WebRequest e Invoke-RestMethod?


24

Eu tenho usado Invoke-WebRequestcom êxito para postar solicitações para uma API baseada em REST do PowerShell.

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

Hoje me deparei com Invoke-RestMethodsons mais apropriados para o que estou fazendo. Qual é a diferença e existe um motivo para usar um sobre o outro?


Invoke-RestMethod tem um conjunto de parâmetros diferente. Além disso (sempre um pouco difícil de dizer), provavelmente foi introduzido em uma versão posterior do PowerShell.
Seth

1
Ambos foram introduzidos na versão 3. Isso pode ser encontrado nas Get-Helppáginas dos dois cmdlets. Especularia que isso Invoke-RestMethodfoi tecnicamente publicado primeiro, já que o link "Versão on-line" Get-Helptermina com um número menor do que o encontrado na Invoke-WebRequestpágina da página.
root

Respostas:


30

Você pode descobrir descompilando a Microsoft.PowerShell.Commands.Utilitymontagem.

Basicamente, Invoke-WebRequestnão lida com a análise de dados. Com -UseBasicParsing, ele faz algumas análises de HTML baseadas em Regex. Sem essa opção, ele usará a API COM do Internet Explorer para analisar o documento.

É isso aí. Ele sempre tentará analisar o HTML.

Invoke-RestMethodpor outro lado, possui código para suportar conteúdo JSON e XML. Ele tentará detectar um decodificador apropriado. Ele não suporta HTML (exceto HTML compatível com XML, é claro).

Ambos compartilham a mesma lógica principal para fazer a solicitação HTTP real. É apenas no processamento de resultados que eles diferem.

Ver é crer!

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 fez um post sobre isso . A conclusão:

Invoke-RestMethodé muito melhor em lidar com resultados XML e JSON, enquanto Invoke-WebRequesté melhor em lidar com resultados diretos de HTML

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.