我正在尝试使用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/

10-13 06:14