ฉันจะส่งคำขอ HTTP POST ไปยังเซิร์ฟเวอร์จาก Excel โดยใช้ VBA ได้อย่างไร


คำตอบ:


149
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send("")

อีกทางเลือกหนึ่งสำหรับการควบคุมมากขึ้นกว่าการร้องขอ HTTP คุณสามารถใช้ในสถานที่ของWinHttp.WinHttpRequest.5.1MSXML2.ServerXMLHTTP


10
เพื่อให้สามารถควบคุมคำขอ HTTP ได้ดีขึ้นคุณสามารถใช้ "WinHttp.WinHttpRequest.5.1" แทน "MSXML2.ServerXMLHTTP"
Matthew Murdoch

5
ที่น่าสังเกตคือคุณสามารถใช้สิ่งนี้เพื่อออก HTTP PUT ได้โดยเปลี่ยน "POST" เป็น "PUT" เนื้อหาที่จะ PUT จะอยู่ในเมธอด. send () ส่วนหัวเพิ่มเติมที่คุณต้องตั้งค่าสามารถทำได้ตามไวยากรณ์ที่ใช้ในตัวอย่าง User-Agent
radicand

7
โปรดอย่าใช้วงเล็บรอบพารามิเตอร์หากคุณไม่ใช้ค่าส่งคืนของ Sub: VBA Syntax ไม่อนุญาตให้มีวงเล็บรอบ ๆ พารามิเตอร์ของ Sub (จำเป็นสำหรับฟังก์ชัน) ดังนั้นวงเล็บเหล่านี้จึงเป็นวงเล็บเลขคณิตที่ใช้เพื่อชี้แจงลำดับความสำคัญของตัวดำเนินการ นอกเหนือจากการทำให้เข้าใจผิดและไม่ชัดเจนแล้วสิ่งนี้อาจส่งผลให้เกิดข้อผิดพลาดรันไทม์หากอาร์กิวเมนต์เป็นวัตถุ และถึงแม้จะไม่ได้ถามอย่างชัดเจนสำหรับมักจะคุณต้องการที่จะใช้การตอบสนอง HTTP objHTTP.responseTextซึ่งคุณสามารถพูดถึงสามารถเรียกดูโดย
Leviathan

4
@ Leviathan ที่ parens ทำมากกว่านั้น: พวกเขาทำให้รันไทม์ VBA ประเมินนิพจน์เป็นค่าและส่งต่อไปยังเมธอด ByVal ไม่ว่าลายเซ็นของเมธอดจะระบุByRefหรือไม่ก็ตาม นั่นเป็นเหตุผลว่าทำไมการใช้มันกับตัวแปรออบเจ็กต์ประเภทที่ไม่มีสมาชิกเริ่มต้นทำให้เกิดข้อผิดพลาดขณะทำงาน และใช้พวกเขาบนวัตถุที่จะมีสมาชิกเริ่มต้นผ่านค่าที่สมาชิกเริ่มต้นแทนของวัตถุที่เกิดขึ้นจริง
Mathieu Guindon

1
แล้ว json payload ล่ะ ... เราจะส่งมันไปได้ยังไง?
Amrit

54

หากคุณต้องการให้ใช้งานได้ทั้งบน Mac และ Windows คุณสามารถใช้ QueryTables:

With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2"))
    .PostText = "origin_airport=MSN&destination_airport=ORD"
    .RefreshStyle = xlOverwriteCells
    .SaveData = True
    .Refresh
End With

หมายเหตุ:

  • เกี่ยวกับเอาต์พุต ... ฉันไม่รู้ว่าจะส่งคืนผลลัพธ์ไปยังเซลล์เดียวกันกับที่เรียกฟังก์ชัน VBA ได้หรือไม่ ในตัวอย่างด้านบนผลลัพธ์จะถูกเขียนลงใน A2
  • เกี่ยวกับอินพุต ... หากคุณต้องการให้ผลลัพธ์รีเฟรชเมื่อคุณเปลี่ยนเซลล์บางเซลล์ตรวจสอบให้แน่ใจว่าเซลล์เหล่านั้นเป็นอาร์กิวเมนต์ของฟังก์ชัน VBA ของคุณ
  • สิ่งนี้จะใช้ไม่ได้กับ Excel สำหรับ Mac 2008 ซึ่งไม่มี VBA Excel for Mac 2011 ได้รับ VBA กลับคืนมา

สำหรับรายละเอียดเพิ่มเติมคุณสามารถดูสรุปทั้งหมดของฉันเกี่ยวกับ "การใช้บริการเว็บจาก Excel "


3
+1: ฉันต้องการมันบน Windows เท่านั้น แต่โซลูชันข้ามแพลตฟอร์มอาจเป็นประโยชน์ต่อคนอื่น
Matthew Murdoch

ฉันไม่คิดว่าคุณสามารถเข้าถึงรหัส html ได้จริงๆคุณจะได้รับข้อมูลบนหน้าเว็บที่แสดงผลเท่านั้น (ไม่ใช่รหัส html จริง)
user1493046

1
+1 สำหรับโซลูชันข้ามแพลตฟอร์มและ +1 (ถ้าทำได้) สำหรับบทสรุปทั้งหมดพร้อมลิงก์สำคัญและทั้งหมด ขอบคุณ !!
บิน

ฉันต้องรองรับทั้ง windows และ mac และวิธีนี้ก็ถูกต้อง! โปรดทราบว่าเมื่อคุณระบุ PostText URL ควรประมวลผลคำขอ POST มิฉะนั้นควรประมวลผลคำขอ GET
Amolk

1
เป็นไปได้หรือไม่ที่จะส่งผลลัพธ์ไปยังตัวแปรแทนที่จะเป็น Range จำเป็นต้องทำการแยกวิเคราะห์ Json
Standaa Reinstate Monica

44

นอกเหนือจาก anwser ของBill the Lizard :

แบ็กเอนด์ส่วนใหญ่จะแยกวิเคราะห์ข้อมูลโพสต์ดิบ ตัวอย่างเช่นใน PHP คุณจะมีอาร์เรย์$_POSTซึ่งตัวแปรแต่ละตัวในข้อมูลโพสต์จะถูกเก็บไว้ ในกรณีนี้คุณต้องใช้ส่วนหัวเพิ่มเติม"Content-type: application/x-www-form-urlencoded":

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHTTP.send ("var1=value1&var2=value2&var3=value3")

"$HTTP_RAW_POST_DATA"มิฉะนั้นคุณจะต้องอ่านข้อมูลที่โพสต์ดิบในตัวแปร


1
ฉันพยายามโพสต์คำขอนี้ (โดยใช้เครื่องหมายปีกกา) และได้รับข้อผิดพลาดในการรวบรวม ... โปรดช่วย: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}"
ซอ

@fiddle คุณเข้ารหัส URL ของสตริงนั้นหรือไม่ วงเล็บปีกกามีความกังวลน้อยกว่าเครื่องหมายคำพูด (ซึ่งจะยุติสตริงใน VBA ")
Ruscal

6

คุณสามารถใช้ServerXMLHTTPในโครงการ VBA ได้โดยเพิ่มการอ้างอิงถึงMSXML.

  1. เปิด VBA Editor (โดยปกติจะแก้ไขมาโคร)
  2. ไปที่รายการข้อมูลอ้างอิงที่มีอยู่
  3. ตรวจสอบ Microsoft XML
  4. คลิกตกลง

(จากการอ้างอิง MSXML ภายในโครงการ VBA )

เอกสาร ServerXMLHTTP MSDNมีรายละเอียดเกี่ยวกับคุณสมบัติและวิธีการของการ ServerXMLHTTP

ในระยะสั้นมันทำงานโดยทั่วไปดังนี้:

  1. เรียกวิธีการเปิดเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล
  2. โทรส่งเพื่อส่งคำขอ
  3. อ่านการตอบสนองผ่านresponseXML , responseText , responseStreamหรือresponseBody

1
ลิงก์นั้นใช้ jscript ไม่ใช่ VBA
John Henckel

1
ขอบคุณ @JohnHenckel ฉันได้ทำการเปลี่ยนแปลงบางอย่างเพื่อให้คำตอบนั้นเป็นปัจจุบัน
Mark Biek

3

ในการตอบสนองของผู้ใช้รายอื่นให้เสร็จสมบูรณ์:

สำหรับสิ่งนี้ฉันได้สร้างวัตถุ"WinHttp.WinHttpRequest.5.1"

ส่งคำขอโพสต์พร้อมข้อมูลบางส่วนจาก Excel โดยใช้ VBA:

Dim LoginRequest As Object
Set LoginRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
LoginRequest.Open "POST", "http://...", False
LoginRequest.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
LoginRequest.send ("key1=value1&key2=value2")

ส่งคำขอรับด้วยการรับรองความถูกต้องโทเค็นจาก Excel โดยใช้ VBA:

Dim TCRequestItem As Object
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
TCRequestItem.Open "GET", "http://...", False
TCRequestItem.setRequestHeader "Content-Type", "application/xml"
TCRequestItem.setRequestHeader "Accept", "application/xml"
TCRequestItem.setRequestHeader "Authorization", "Bearer " & token
TCRequestItem.send

เดวิดเมื่อคุณส่งคำขอคุณอ่านคำตอบอย่างไร
ps0604

คำตอบอยู่ข้างในTCRequestItem Objectคุณสามารถอ่านได้เช่น: TCRequestItem.ResponseTextหลังทำTCRequestItem.send
david.q

0

ผมทำอย่างนี้ก่อนที่จะใช้ห้องสมุด MSXML แล้วใช้วัตถุ XMLHttpRequest ดูที่นี่


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