मैं VBA का उपयोग करके Excel से किसी सर्वर पर HTTP POST अनुरोध कैसे भेज सकता हूं?


जवाबों:


147
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.1स्थान पर उपयोग कर सकते हैं MSXML2.ServerXMLHTTP


9
HTTP अनुरोध पर अधिक नियंत्रण के लिए आप "MSXML2.ServerXMLHTTP" के बजाय "WinHttp.WinHttpRequest.5.1" का उपयोग कर सकते हैं
मैथ्यू मर्डोक

5
ध्यान देने योग्य बात यह है कि आप "POST" को "PUT" में बदलकर HTTP PUT जारी करने के लिए भी इसका उपयोग कर सकते हैं। PUT की सामग्री .send () विधि में जाती है। आपके द्वारा सेट किए जाने वाले किसी भी अतिरिक्त हेडर को उपयोगकर्ता-एजेंट उदाहरण में उपयोग किए गए वाक्यविन्यास के बाद भी किया जा सकता है।
रेडिकैंड

7
यदि आप उप के रिटर्न मान का उपयोग नहीं करते हैं, तो कृपया पैरामीटर के आसपास कोष्ठक का उपयोग न करें: VBA सिंटैक्स सब-पैरामीटर के आसपास कोष्ठक को अनुमति नहीं देते हैं (वे कार्य के लिए आवश्यक हैं, हालांकि), इसलिए ये कोष्ठक वास्तव में अंकगणित कोष्ठक हैं जो ऑपरेटर की पूर्वता को स्पष्ट करने के लिए उपयोग किया जाता है। भ्रामक और अस्पष्ट होने के अलावा, यह अंततः तर्क त्रुटि में परिणाम कर सकता है यदि तर्क एक वस्तु है। और यद्यपि स्पष्ट रूप से नहीं पूछा गया है, आमतौर पर आप HTTP प्रतिक्रिया का उपयोग करना चाहेंगे, जिसका आप उल्लेख कर सकते हैं कि इसे पुनः प्राप्त किया जा सकता है objHTTP.responseText
लेविथान

4
@ लेविथान वास्तव में इससे कहीं अधिक हैं: वे VBA रनटाइम को एक मूल्य के रूप में अभिव्यक्ति का मूल्यांकन करते हैं , और विधि के हस्ताक्षर कहते हैं या नहीं इसकी परवाह किए बिना इसे विधि ByVal को पास करते हैं । यही कारण है कि उन्हें एक प्रकार के ऑब्जेक्ट चर के साथ उपयोग करना जिसमें डिफ़ॉल्ट सदस्य नहीं है, रन-टाइम त्रुटियों का कारण बनता है; और उनका उपयोग उस वस्तु पर किया जाता है जिसमें एक डिफ़ॉल्ट सदस्य होता है, वास्तविक वस्तु के बजाय उस डिफ़ॉल्ट सदस्य के मान को पास करता है। ByRef
मैथ्यू गुइंडन

1
एक लाख बार धन्यवाद। मुझे पता नहीं क्यों, क्योंकि मैंने इसे किसी अन्य उदाहरण में नहीं देखा था, लेकिन "उपयोगकर्ता-एजेंट" हेडर मेरे लिए महत्वपूर्ण था, क्योंकि अन्यथा मेरे अनुरोध में शरीर नहीं भेजा जा रहा था।
redOctober13

51

यदि आपको मैक और विंडोज दोनों पर काम करने की आवश्यकता है, तो आप 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 फ़ंक्शन का तर्क हैं।
  • यह मैक 2008 के लिए एक्सेल पर काम नहीं करेगा, जिसमें VBA नहीं है। मैक 2011 के लिए एक्सेल को VBA वापस मिल गया।

अधिक विवरण के लिए, आप " एक्सेल से वेब सेवाओं का उपयोग करने के बारे में मेरा पूरा सारांश देख सकते हैं ।"


3
+1: मुझे केवल Windows पर इसकी आवश्यकता है लेकिन एक क्रॉस-प्लेटफ़ॉर्म समाधान किसी और को लाभ दे सकता है।
मैथ्यू मर्डोक

मुझे नहीं लगता कि आप वास्तव में html कोड का उपयोग कर सकते हैं, आप केवल प्रदान किए गए वेब पेज (वास्तविक HTML कोड नहीं) पर जानकारी प्राप्त कर सकते हैं
user1493046

1
क्रॉस-प्लेटफ़ॉर्म समाधान के लिए +1 और जिस्ट लिंक और सभी के साथ पूर्ण सारांश के लिए +1 (यदि मैं कर सकता था)। धन्यवाद!!
हवाई

मुझे विंडोज़ और मैक दोनों का समर्थन करना था, और यह समाधान सही था! ध्यान दें कि जब आप पोस्टटेक्स्ट निर्दिष्ट करते हैं, तो URL को POST अनुरोधों को संसाधित करना चाहिए, अन्यथा इसे GET अनुरोधों को संसाधित करना चाहिए।
एमकॉक

1
क्या किसी श्रेणी के बजाय परिणामों को एक चर में बनाना संभव है? कुछ जोंस पार्सिंग करने की जरूरत है।
स्टैनिस्लासद्रग मोनिका

42

का anwser के अलावा विधेयक छिपकली :

अधिकांश बैकेंड कच्चे पोस्ट डेटा को पार्स करते हैं। उदाहरण के लिए 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
मैं इस अनुरोध को (घुंघराले ब्रेसिज़ के साथ) पोस्ट करने और संकलन त्रुटियों को प्राप्त करने की कोशिश कर रहा हूं ... क्या आप pls मदद कर सकते हैं: "{" अनुरोध ": {" carName ":" Honda "," मॉडल ":" 1A5 "}}
बेला

6

आप ServerXMLHTTPVBA प्रोजेक्ट में संदर्भ जोड़कर उपयोग कर सकते हैं MSXML

  1. VBA संपादक खोलें (आमतौर पर मैक्रो संपादित करके)
  2. उपलब्ध सन्दर्भों की सूची पर जाएँ
  3. Microsoft XML की जाँच करें
  4. ओके पर क्लिक करें।

( VBA प्रोजेक्ट्स के भीतर MSXML को संदर्भित करने से )

ServerXMLHTTP MSDN प्रलेखीकरण सभी गुण और ServerXMLHTTP के तरीकों के बारे में पूरी जानकारी नहीं है।

संक्षेप में, यह मूल रूप से इस तरह काम करता है:

  1. दूरस्थ सर्वर से कनेक्ट करने के लिए खुली विधि को कॉल करें
  2. अनुरोध भेजने के लिए कॉल भेजें
  3. ResponseXML , responseText , responseStream या responseBody के माध्यम से प्रतिक्रिया पढ़ें

1
वह लिंक jscript का उपयोग करता है, VBA का नहीं
जॉन हेंकेल

1
धन्यवाद @ जॉनहोनेल। मैंने कुछ परिवर्तन किए हैं जो उत्तर तक ले जाएं।
मार्क बेज

3

अन्य उपयोगकर्ताओं की प्रतिक्रिया को पूरा करने के लिए:

इसके लिए मैंने एक "WinHttp.WinHttpRequest.5.1" ऑब्जेक्ट बनाया है।

VBA का उपयोग करके Excel के कुछ डेटा के साथ पोस्ट अनुरोध भेजें:

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")

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
डेविड क्यू

0

मैंने MSXML लाइब्रेरी का उपयोग करने से पहले और फिर XMLHttpRequest ऑब्जेक्ट का उपयोग करने से पहले ऐसा किया था, यहां देखें ।


1
फाइल नहीं मिली।
सुषुंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.