我试图使用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有什么想法吗?
我找到了这,这与我的问题相似,但我不明白解决方案。
发布于 2016-08-19 06:08:42
我也遇到了这个问题。它似乎仅限于WinHttp.WinHttpRequest COM接口。有几个不同的选项来解决这个问题。
经过一番挖掘,我从微软的一名员工那里找到了这个职位。它给出了一个清晰的解释,并建议发送一个二进制数组。
如果您是使用POSTing对象的字符串,则不能覆盖它如何对字符串进行编码以进行传输。WinHttpRequest对象将始终将Unicode字符串转换为UTF-8。 但是,请注意,当编码为UTF-8时,只包含7位拉丁-1/ISO-8859-1字符的Unicode字符串将保持不变;-)在这种情况下,WinHttpRequest对象不会将"Charset=UTF-8“属性附加到内容类型标头中。(我认为服务器会假设POST数据是ISO8859-1。) 因此,如果您是POSTing的XML文本数据包含拉丁文-1字母数字或标点符号代码(每个字符代码小于十进制128),那么您所要做的就是在内容类型标题中指定“ISO8859-1”字符集:
WinHttpReq.SetRequestHeader "Content-Type", "application/xml;Charset=ISO-8859-1"但是,如果POST数据包含8位字符,则无法将数据作为字符串提供给Send方法。为了避免UTF-8转换,应用程序必须将字符串转换为字节数组,并提供该字符串。WinHttpRequest对象不会尝试对字节数组进行任何数据转换。 致以敬意, 斯蒂芬·苏尔泽 微软公司
除了发送二进制数组之外,第二个选项是切换到Msxml2.XMLHTTP或Msxml2.ServerXMLHTTP。这两种方法都不会损坏Content-Type头。幸运的是,在创建WinHttp.WinHttpRequest时,微软有意使用Msxml2.XMLHTTP作为界面的模板。因此,转换代码非常简单。
另外,Msxml2.ServerXMLHTTP COM接口在内部使用WinHTTP。因此,当您无法访问WinHttp.WinHttpRequest独有的一些特性时,两者都使用相同的后端。
第三种选择是使用ADODB.Stream。它允许您使用IStream,这不是您通常可以从VBA中做的事情。下面的示例代码基于问题“如何在BinaryArray中创建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)https://stackoverflow.com/questions/35641883
复制相似问题