Jaka jest różnica między Invoke-WebRequest a Invoke-RestMethod?

24

Z powodzeniem Invoke-WebRequestwysyłam żądania do interfejsu API opartego na REST z PowerShell.

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

Dzisiaj natknąłem się na to, Invoke-RestMethodco brzmi bardziej trafnie nazwane dla tego, co robię. Jaka jest różnica i czy istnieje powód, aby używać jednego nad drugim?

James
źródło
Invoke-RestMethod ma inny zestaw parametrów. Ponadto (zawsze nieco trudny do powiedzenia) został prawdopodobnie wprowadzony w późniejszej wersji programu PowerShell.
Seth
1
@Seth Oba zostały wprowadzone w wersji 3. Można je znaleźć na Get-Helpstronach obu poleceń cmdlet. Spekulowałbym, że Invoke-RestMethodtechnicznie opublikowano go jako pierwszy, ponieważ link „Wersja online” Get-Helpkończy się na mniejszym numerze niż ten znaleziony na Invoke-WebRequeststronie.
korzeń

Odpowiedzi:

30

Możesz dowiedzieć się, dekompilując Microsoft.PowerShell.Commands.Utilityzestaw.

Zasadniczo Invoke-WebRequestnie zajmuje się zbytnio analizowaniem danych. Za pomocą -UseBasicParsingwykonuje parsowanie HTML oparte na Regex. Bez tego przełącznika użyje interfejsu API COM programu Internet Explorer do parsowania dokumentu.

to jest to! Zawsze będzie parsował HTML.

Invoke-RestMethodz drugiej strony ma kod do obsługi treści JSON i XML. Spróbuje wykryć odpowiedni dekoder. Robi nie wspiera HTML (z wyjątkiem HTML XML zgodnych, oczywiście).

Oba mają tę samą podstawową logikę, aby wykonać rzeczywiste żądanie HTTP. Różnią się tylko przetwarzaniem wyników.

Zobaczyć to uwierzyć!

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.
źródło
4

systemcenterautomation.com napisał na ten temat post na blogu . Konkluzja:

Invoke-RestMethodznacznie lepiej radzi sobie z wynikami XML i JSON, a Invoke-WebRequestlepiej z prostymi wynikami HTML

Ohad Schneider
źródło