В чем разница между Invoke-WebRequest и Invoke-RestMethod?

24

Я успешно использую Invoke-WebRequestдля отправки запросов в API на основе REST из PowerShell.

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

Сегодня я наткнулся на то, Invoke-RestMethodчто звучит более метко для того, что я делаю. В чем разница, и есть ли причина использовать один над другим?

Джеймс
источник
Invoke-RestMethod имеет другой набор параметров. Кроме того (всегда трудно сказать), он, вероятно, был представлен в более поздней версии PowerShell.
Сет
1
@Seth Оба были введены в версии 3. Это можно найти на Get-Helpстраницах обоих командлетов. Я бы предположил, что это Invoke-RestMethodбыло технически опубликовано в первую очередь, так как ссылка «Онлайн-версия» Get-Helpзаканчивается на меньшее число, чем найденное на Invoke-WebRequestстранице.
root

Ответы:

30

Вы можете узнать, декомпилировав Microsoft.PowerShell.Commands.Utilityсборку.

По сути, Invoke-WebRequestне так уж много разбирается с данными. С помощью -UseBasicParsingэтого он выполняет анализ HTML на основе Regex. Без этого параметра он будет использовать COM API Internet Explorer для анализа документа.

Вот и все. Он всегда будет пытаться разобрать HTML.

Invoke-RestMethodс другой стороны, есть код для поддержки содержимого JSON и XML. Он попытается обнаружить соответствующий декодер. Он не поддерживает HTML (за исключением XML-совместимого HTML, конечно).

Оба используют одну и ту же базовую логику для выполнения фактического HTTP-запроса. Только в обработке результатов они отличаются.

Видеть значит верить!

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 сделал сообщение в блоге об этом . Вывод:

Invoke-RestMethodгораздо лучше справляется с результатами XML и JSON, а Invoke-WebRequestлучше справляется с прямыми результатами HTML

Охад Шнайдер
источник