首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >添加到内容类型的WinHttp.WinHttpRequest

添加到内容类型的WinHttp.WinHttpRequest
EN

Stack Overflow用户
提问于 2016-02-26 01:42:24
回答 1查看 9K关注 0票数 12

我试图使用vba WinHttp.WinHttpRequest向kigo的api发出请求,但WinHttpRequest在发送请求时更改了添加Charset=UTF-8的内容类型,而该kigo的api返回415错误。

我将内容类型设置如下

代码语言:javascript
运行
复制
web_Http.SetRequestHeader "Content-Type", "application/json"

但是,当我查看Wireshark中的请求时,内容类型如下

代码语言:javascript
运行
复制
Content-Type: application/json; Charset=UTF-8

有什么想法吗?

我找到了,这与我的问题相似,但我不明白解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.XMLHTTPMsxml2.ServerXMLHTTP。这两种方法都不会损坏Content-Type头。幸运的是,在创建WinHttp.WinHttpRequest时,微软有意使用Msxml2.XMLHTTP作为界面的模板。因此,转换代码非常简单。

另外,Msxml2.ServerXMLHTTP COM接口在内部使用WinHTTP。因此,当您无法访问WinHttp.WinHttpRequest独有的一些特性时,两者都使用相同的后端。

第三种选择是使用ADODB.Stream。它允许您使用IStream,这不是您通常可以从VBA中做的事情。下面的示例代码基于问题“如何在BinaryArray中创建VbScript?”的答案。

代码语言:javascript
运行
复制
' 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)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35641883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档