ความแตกต่างระหว่าง 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 Both ถูกนำมาใช้ในเวอร์ชัน 3 ซึ่งสามารถพบได้ในGet-Helpหน้าสำหรับ cmdlets ทั้งสอง ฉันคาดการณ์ว่าInvoke-RestMethodมีการเผยแพร่ทางเทคนิคก่อนเนื่องจากลิงก์ "เวอร์ชั่นออนไลน์" Get-Helpท้ายที่สุดมีจำนวนน้อยกว่าที่พบในInvoke-WebRequestหน้าเว็บของ
รูต

คำตอบ:


30

คุณสามารถค้นหาโดยแยกMicrosoft.PowerShell.Commands.Utilityส่วนประกอบออกจากกัน

โดยทั่วไปInvoke-WebRequestจะไม่จัดการกับการแยกวิเคราะห์ข้อมูลทั้งหมดที่มาก ด้วย-UseBasicParsingจะแยกวิเคราะห์ HTML ตาม Regex หากไม่มีสวิตช์นี้จะใช้ Internet Explorer COM API เพื่อแยกวิเคราะห์เอกสาร

แค่นั้นแหละ. มันจะพยายามแยกวิเคราะห์ 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 แบบตรง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.