我在VBScript中使用JSON体发出服务器端HTTP请求,如下所示:
Set oXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oXMLHttp.open cMethod, cAPIURL, False, cUser, cPassword
oXMLHttp.setRequestHeader "Content-Type", "application/json"
oXMLHttp.send(cData)
cReturn = oXMLHttp.responseText
Set oXMLHttp = Nothing我调用的服务期望内容类型自然是application/json。正如您所看到的,我正在将上面的请求头设置为这样。
问题是,无论我将内容类型设置为什么,MSXML2.ServerXMLHTTP都会附加一个字符集(我找不到这种行为的文档),默认的是UTF-8。因此,最终,头以application/json; Charset=UTF-8的形式发送,web服务不喜欢这样做。
奇怪的是,我可以使用setRequestHeader显式地设置一个字符集,甚至是一个荒谬的字符集,然后MSXML2.ServerXMLHTTP会将头单独放在一边。例如..。
oXMLHttp.setRequestHeader "Content-Type", "application/json; Charset=FOO"工作得很好,没有被碰过。如何阻止MSXML2.ServerXMLHTTP更改内容类型?
编辑:我发现MSXML2.ServerXMLHTTP6.0没有显示这种行为,至少在默认情况下是这样的。但是我仍然想知道是否有解决方案,因为我不确定在需要安装这个应用程序的地方是否有这个解决方案。
Set oXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
发布于 2016-01-26 22:18:20
根据文档,当请求体为字符串时,这是发送方法的预期行为。顺便说一句,我不能在Windows10和Windows 2008 R2上重现这个问题,但是Windows 2008。因此,我唯一能说的是,这种行为对于旧版本的MSXML3.0必须有效。
如果输入类型是BSTR,则响应总是被编码为UTF-8。调用方必须设置具有适当内容类型的内容类型标头,并包含一个字符集参数。 如果输入类型是XMLDOM对象,则响应将根据<?文档中的XML声明。 如果没有XML声明或编码属性,则假定为。 如果输入类型是UI1的SAFEARRAY,则响应按原样发送,不需要额外编码。调用方必须使用适当的内容类型设置内容类型标头。
作为解决办法,您可以发送字节的cData,而不是指向变量。这对所有人都有好处。
Function Utf8BytesOf(text)
With Server.CreateObject("Adodb.Stream")
.Charset = "UTF-8"
.Open
.WriteText text
.Position = 0
.Type = 1 'adTypeBinary
.Read 3 'skip UTF-8 BOM
Utf8BytesOf = .Read 'read rest
.Close
End With
End Function
Set oXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oXMLHttp.open cMethod, cAPIURL, False, cUser, cPassword
oXMLHttp.setRequestHeader "Content-Type", "application/json"
oXMLHttp.send Utf8BytesOf(cData)
cReturn = oXMLHttp.responseText
Set oXMLHttp = Nothinghttps://stackoverflow.com/questions/35022415
复制相似问题