2016-02-26 10 views
5

मैं VBA WinHttp.WinHttpRequest का उपयोग कर kigo के एपीआई के लिए एक अनुरोध बनाने के लिए कोशिश कर रहा हूँ करने के लिए जोड़ने, मैं एक अनुरोध भेजने के लिए कर रहा था, लेकिन WinHttpRequest सामग्री प्रकार जोड़ने में परिवर्तन charset = utf -8 जब यह अनुरोध भेजता है, उस किगो की एपीआई 415 त्रुटि देता है।WinHttp.WinHttpRequest सामग्री प्रकार

मैं इस

web_Http.SetRequestHeader "Content-Type", "application/json" 

की तरह सामग्री प्रकार निर्धारित करते हैं लेकिन जब मैं Wireshark में अनुरोध पर नज़र डालें सामग्री प्रकार इस

Content-Type: application/json; Charset=UTF-8 

कोई भी विचार की तरह है?

मुझे this मिला, जो मेरी समस्या के समान है लेकिन मैं समाधान को समझ नहीं पा रहा हूं।

+0

वे किस क्रिससेट की अपेक्षा कर रहे हैं? क्या आपने इसे अपनी 'सामग्री-प्रकार' स्ट्रिंग में निर्दिष्ट करने का प्रयास किया है? –

+0

सामग्री-प्रकार किसी भी चीज़ के बिना केवल एप्लिकेशन/जेसन होना चाहिए, यदि सामग्री-प्रकार में एप्लिकेशन/जेसन से परे कुछ भी है तो मुझे कोई त्रुटि मिलती है। हां मैंने सामग्री-प्रकार स्ट्रिंग निर्दिष्ट करने का प्रयास किया। यह अनुरोध सेटअप करने के बाद होता है। –

+0

अर्धविराम के साथ अपनी स्ट्रिंग को समाप्त करने का प्रयास करें। कोइ भाग्य? –

उत्तर

0

मैं भी इस समस्या में चल रहा हूं। ऐसा लगता है कि WinHttp.WinHttpRequest COM इंटरफ़ेस तक सीमित है। इसे हल करने के लिए कुछ अलग-अलग विकल्प हैं।

कुछ खुदाई के बाद, मुझे माइक्रोसॉफ्ट कर्मचारी से this post मिला। यह एक स्पष्ट स्पष्टीकरण देता है और एक बाइनरी सरणी में भेजने की सिफारिश करता है।

आप WinHttpRequest वस्तु का उपयोग कर एक स्ट्रिंग पोस्ट कर रहे हैं, तो आप ओवरराइड यह कैसे संचरण के लिए स्ट्रिंग को कूटबद्ध नहीं कर सकता। WinHttpRequest ऑब्जेक्ट हमेशा यूनिकोड स्ट्रिंग को यूटीएफ -8 में परिवर्तित करेगा।

हालांकि, ध्यान दें कि एक यूनिकोड स्ट्रिंग है कि केवल 7 बिट लैटिन -1/ISO-8859-1 वर्ण जब के रूप में UTF-8 ;-) ऐसे मामलों में इनकोडिंग यथावत रहेगा, WinHttpRequest वस्तु नहीं है अपने सामग्री-प्रकार शीर्षलेख में "वर्णसेट = यूटीएफ -8" विशेषता जोड़ें। (और मैं सोच सकता है कि सर्वर ग्रहण करेंगे कि पोस्ट डेटा ISO-8859-1 है।)

तो, अगर एक्सएमएल पाठ डेटा है कि आप पोस्ट कर रहे हैं लैटिन -1 अक्षरांकीय या विराम वर्ण कोड हैं (प्रत्येक

WinHttpReq.SetRequestHeader "Content-Type", "application/xml;Charset=ISO-8859-1"

हालांकि, अगर आपकी पोस्ट डेटा 8 में शामिल है: दशमलव 128) की तुलना में कम है, तो सब आप क्या करना है, यह निर्दिष्ट "ISO-8859-1" अपने सामग्री प्रकार में शब्दसमुच्चय शीर्षक है -बीबी अक्षरों, तो आप डेटा को भेजें विधि के लिए एक स्ट्रिंग के रूप में आपूर्ति नहीं कर सकते हैं। यूटीएफ -8 रूपांतरण से बचने के लिए, आपके एप्लिकेशन को स्ट्रिंग को बाइट सरणी में परिवर्तित करना होगा, और इसके बजाय आपूर्ति करना होगा। WinHttpRequest ऑब्जेक्ट किसी बाइट सरणी पर किसी भी डेटा रूपांतरण का प्रयास नहीं करेगा।

सादर,

स्टीफन Sulzer

माइक्रोसॉफ्ट कार्पोरेशन


एक दूसरा विकल्प, एक द्विआधारी सरणी में भेजने की तुलना में अन्य, Msxml2.XMLHTTP या Msxml2.ServerXMLHTTP करने के लिए स्विच करने के लिए है। इन मंगल में से कोई भी Content-Type शीर्षलेख नहीं है।सौभाग्य से, जब WinHttp.WinHttpRequest बनाया गया था, तो माइक्रोसॉफ्ट ने जानबूझकर इंटरफेस के लिए टेम्पलेट के रूप में Msxml2.XMLHTTP का उपयोग किया। तो, कोड को बदलने के लिए यह काफी छोटा है।

इसके अलावा, Msxml2.ServerXMLHTTP COM इंटरफ़ेस uses WinHTTP internally। इसलिए, जब आप WinHttp.WinHttpRequest के लिए विशिष्ट सुविधाओं तक पहुंच खो रहे हैं, तो दोनों एक ही बैकएंड का उपयोग करते हैं।


तीसरा विकल्प ADODB.Stream का उपयोग करना है। यह आपको IStream के साथ काम करने की अनुमति देता है, जो ऐसा कुछ नहीं है जिसे आप आमतौर पर वीबीए से कर सकते हैं। नीचे नमूना कोड "How to create BinaryArray in VbScript?" पर उत्तर के आधार पर आधारित है।

' Create a Binary Stream 
Set objStreamBinary = CreateObject("ADODB.Stream") 
objStreamBinary.Type = 1 
objStreamBinary.Open 

' Create a Text Stream 
Set objStreamText = CreateObject("ADODB.Stream") 
objStreamText.Type = 2 
objStreamText.Open 
' Copy the POST data to the Text Stream 
objStreamText.WriteText strRequest 
objStreamText.Position = 2 
' Copy the Text Stream Contents to the Binary Stream 
objStreamText.CopyTo objStreamBinary 
objStreamText.Close 

' Read the contents of the Binary Stream 
' and send it to the WinHttpRequest object 
web_Http.Send objStreamBinary.Read(-1) 
+0

के साथ अनुरोध करने में सक्षम था 'चूंकि वीबीए ने दृढ़ता से टाइप किए गए सरणी नहीं हैं' - वीबीए ने दृढ़ता से सरणी टाइप की हैं। वीबीस्क्रिप्ट एक अलग भाषा है। – GSerg

+0

@GSerg धन्यवाद। मुझे पता नहीं था। मैंने उस वाक्य को मेरे उत्तर से हटा दिया है। – jveazey

संबंधित मुद्दे