我正在尝试使用vba WinHttp.WinHttpRequest向kigo的api发出请求,
我能够发送请求,但是WinHttpRequest更改了添加的内容类型
Charset = UTF-8发送请求时,该kigo的api返回415错误。
我这样设置内容类型
web_Http.SetRequestHeader "Content-Type", "application/json"
但是当我在Wireshark中查看请求时,内容类型是这样的
Content-Type: application/json; Charset=UTF-8
有任何想法吗?
我发现this,类似于我的问题,但我不了解解决方案。
最佳答案
我也遇到了这个问题。它似乎仅限于 WinHttp.WinHttpRequest
COM接口(interface)。有两种不同的方法可以解决此问题。
经过一番挖掘后,我从一名微软员工那里找到了this post。它给出了明确的解释,并建议以二进制数组发送。
除了发送二进制数组之外,第二个选项是切换到 Msxml2.XMLHTTP
或 Msxml2.ServerXMLHTTP
。这些都不影响 Content-Type
header 。幸运的是,当创建WinHttp.WinHttpRequest
时,Microsoft故意将Msxml2.XMLHTTP
用作该接口(interface)的模板。因此,转换代码相当简单。
另外,Msxml2.ServerXMLHTTP
COM接口(interface)uses WinHTTP internally。因此,当您无法 Access 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)
关于vba - WinHttp.WinHttpRequest添加到内容类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35641883/