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

13145
James

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

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

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

18
[Invoke-RestMethod] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/invoke-restmethod) имеет другой набор параметров. Кроме того (всегда трудно сказать), он, вероятно, был представлен в более поздней версии PowerShell. Seth 7 лет назад 0
@Seth Оба были введены в версии 3. Это можно найти на страницах `Get-Help` для обоих командлетов. Я бы предположил, что `Invoke-RestMethod` был технически опубликован первым, поскольку ссылка« Онлайн-версия »в« Get-Help »заканчивается на меньшее число, чем на странице Invoke-WebRequest. root 7 лет назад 0

2 ответа на вопрос

20
Daniel B

Вы можете узнать, декомпилировав 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 
1
Ohad Schneider

systemcenterautomation.com написал в блоге об этом . Вывод:

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