Apa perbedaan antara Invoke-WebRequest dan Invoke-RestMethod?

24

Saya telah berhasil menggunakan Invoke-WebRequestuntuk mengirim permintaan ke API berbasis REST dari PowerShell.

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

Hari ini saya menemukan Invoke-RestMethodyang terdengar lebih tepat untuk apa yang saya lakukan. Apa perbedaannya, dan adakah alasan untuk menggunakan yang satu?

James
sumber
Invoke-RestMethod memiliki set parameter yang berbeda. Selain itu (selalu agak sulit untuk mengatakan) itu mungkin diperkenalkan di versi PowerShell nanti.
Seth
1
@Seth Keduanya diperkenalkan di versi 3. Ini dapat ditemukan di Get-Helphalaman untuk kedua cmdlet. Saya berspekulasi bahwa Invoke-RestMethodsecara teknis diterbitkan pertama kali, karena tautan "Versi Online" pada Get-Helpakhirnya dengan jumlah yang lebih kecil daripada yang ditemukan Invoke-WebRequestdi halaman.
root

Jawaban:

30

Anda dapat mengetahuinya dengan mendekompilasi Microsoft.PowerShell.Commands.Utilityrakitan.

Pada dasarnya, Invoke-WebRequesttidak berurusan dengan parsing data sebanyak itu. Dengan -UseBasicParsing, ia melakukan beberapa parsing HTML berbasis Regex. Tanpa sakelar ini, ia akan menggunakan Internet Explorer COM API untuk mengurai dokumen.

Itu dia. Itu akan selalu berusaha untuk mem-parsing HTML.

Invoke-RestMethoddi sisi lain memiliki kode untuk mendukung konten JSON dan XML. Ini akan berusaha mendeteksi decoder yang sesuai. Itu tidak mendukung HTML (kecuali untuk HTML yang sesuai dengan XML, tentu saja).

Keduanya memiliki logika inti yang sama untuk membuat permintaan HTTP yang sebenarnya. Hanya dalam proses hasil mereka berbeda.

Melihat adalah percaya!

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

systemcenterautomation.com melakukan posting blog tentang ini . Kesimpulannya:

Invoke-RestMethodjauh lebih baik dalam berurusan dengan hasil XML dan JSON, sementara Invoke-WebRequestlebih baik dalam berurusan dengan hasil HTML lurus

Ohad Schneider
sumber