Man*_*oto 7 ms-access vba winhttp winhttprequest
我正在尝试使用vba WinHttp.WinHttpRequest向kigo的api发出请求,我能够发送请求,但WinHttpRequest在发送请求时更改添加Charset = UTF-8的内容类型,其中kigo的api返回415错误.
我像这样设置内容类型
web_Http.SetRequestHeader "Content-Type", "application/json"
Run Code Online (Sandbox Code Playgroud)
但当我在Wireshark中查看请求时,内容类型就是这样的
Content-Type: application/json; Charset=UTF-8
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我找到了这个,这与我的问题类似,但我不明白解决方案.
我也遇到了这个问题。好像仅限于WinHttp.WinHttpRequestCOM接口。有几个不同的选项可以解决这个问题。
经过一番挖掘,我发现了这篇来自微软员工的帖子。它给出了清晰的解释并建议以二进制数组发送。
如果您使用 WinHttpRequest 对象 POST 一个字符串,则不能覆盖它对字符串进行编码以进行传输的方式。WinHttpRequest 对象将始终将 Unicode 字符串转换为 UTF-8。
但是,请注意,仅包含 7 位 LATIN-1/ISO-8859-1 字符的 Unicode 字符串在编码为 UTF-8 时将保持不变;-) 在这种情况下,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 位字符,则不能将数据作为字符串提供给 Send 方法。为了避免 UTF-8 转换,您的应用程序必须将字符串转换为字节数组,并提供它。WinHttpRequest 对象不会尝试对字节数组进行任何数据转换。
问候,
斯蒂芬·苏尔泽
微软公司
除了以二进制数组发送之外,第二个选项是切换到Msxml2.XMLHTTP或Msxml2.ServerXMLHTTP。这些都不会破坏Content-Type标题。幸运的是,在WinHttp.WinHttpRequest创建时,Microsoft 有意将其Msxml2.XMLHTTP用作界面模板。因此,转换代码相当简单。
此外,Msxml2.ServerXMLHTTPCOM 接口在内部使用 WinHTTP。因此,虽然您无法访问 某些独有的功能,但WinHttp.WinHttpRequest两者都使用相同的后端。
第三种选择是使用ADODB.Stream. 它允许您使用IStream,这通常不是您可以从 VBA 中执行的操作。下面的示例代码基于问题“如何在 VbScript 中创建 BinaryArray?”的答案。.
' 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)
Run Code Online (Sandbox Code Playgroud)