2016-02-26 125 views
5

我試圖讓使用VBA WinHttp.WinHttpRequest季語的API請求, 我能發送一個請求,但WinHttpRequest改變內容的類別增加 字符集= UTF -8發送請求時,kigo的api返回415錯誤。WinHttp.WinHttpRequest向內容添加型

我設置的內容類型這樣

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

但是當我在Wireshark的查看請求的內容類型是這樣

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

任何想法?

我發現this,這是類似於我的問題,但我不明白的解決方案。

+0

他們期待什麼字符集?你有沒有試過在你的Content-Type字符串中指定它? –

+0

內容類型應該只是應用程序/ JSON沒有其他任何東西,如果內容類型有任何超出應用程序/ JSON我得到一個錯誤。是的,我試圖指定Content-Type字符串。這發生在我設置請求後。 –

+0

嘗試以分號結尾您的字符串。運氣好的話? –

回答

0

我也遇到了這個問題。它似乎僅限於WinHttp.WinHttpRequest COM接口。有幾個不同的選項來解決這個問題。

經過一番挖掘,我發現微軟員工的this post。它給出了一個清晰的解釋,並建議發送一個二進制數組。

如果您使用WinHttpRequest對象POST一個字符串,則不能覆蓋它如何編碼字符串以進行傳輸。 WinHttpRequest 對象將始終將Unicode字符串轉換爲UTF-8。

然而,請注意,只包含7位時爲UTF-8 ;-)在這種情況下編碼 LATIN-1/ISO-8859-1的字符將保持不變Unicode字符串,所述WinHttpRequest對象不將 「Charset = UTF-8」屬性附加到您的Content-Type標頭。 (我倒覺得 服務器會假定POST數據是ISO-8859-1)。

因此,如果您發佈的XML文本數據包含Latin-1的字母數字 或標點字符代碼(每個不是十進制128)少,那麼您應該 要做的就是指定你的內容類型的「ISO-8859-1」字符集 頭:

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

但是,如果你的POST數據包含8位字符,則不能將數據作爲字符串提供給發送方法 。爲了避免UTF-8 轉換,您的應用程序必須將該字符串轉換爲一個字節數組,然後用 代替。 WinHttpRequest對象不會嘗試在字節數組上進行任何數據 轉換。

問候,

斯蒂芬蘇爾壽

微軟公司


第二選項,比二進制數組發送其它,是切換到Msxml2.XMLHTTPMsxml2.ServerXMLHTTP。這兩個都沒有破壞Content-Type標題。幸運的是,當創建WinHttp.WinHttpRequest時,Microsoft有意使用Msxml2.XMLHTTP作爲界面的模板。所以,轉換代碼是相當簡單的。

另外,Msxml2.ServerXMLHTTP COM接口uses WinHTTP internally。因此,當您無法訪問WinHttp.WinHttpRequest專有的某些功能時,它們都使用相同的後端。


第三個選項是使用ADODB.Stream。它允許您使用IStream,這是您通常不能從VBA執行的操作。以下示例代碼基於問題"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

'由於VBA沒有強類型數組'' - VBA具有強類型的數組。 VBScript是一種不同的語言。 – GSerg

+0

@GSerg謝謝。我不知道。我從我的回答中刪除了這句話。 – jveazey