ServerXMLHTTP附加到内容类型

时间:2016-01-26 19:38:29

标签: vbscript asp-classic http-headers

我正在使用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会将charset附加到我设置内容类型的任何内容(我找不到此行为的文档),默认显示为UTF-8。最后,标题以application/json; Charset=UTF-8发送,Web服务不喜欢。

奇怪的是,我可以使用setRequestHeader明确设置一个字符集,即使是一个荒谬的字符集,然后MSXML2.ServerXMLHTTP将单独保留标题。例如..

oXMLHttp.setRequestHeader "Content-Type", "application/json; Charset=FOO"

工作正常,不受影响。如何阻止MSXML2.ServerXMLHTTP更改内容类型?

编辑:我发现MSXML2.ServerXMLHTTP 6.0没有出现这种行为,至少在默认情况下如此。但我仍然想知道是否有解决方案,因为我不确定这个应用程序是否需要安装。

Set oXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")

1 个答案:

答案 0 :(得分:3)

根据文档,当请求主体是您的字符串时,这是send方法的预期行为。顺便说一下,我应该说我不能在Windows 10和Windows Server 2008 R2上重现这个问题,但是Windows Server 2008。所以我唯一可以说这种行为必须对MSXML 3.0的旧版本有效。

Remarks

  

如果输入类型是BSTR,则响应始终编码为UTF-8。   调用者必须使用适当的内容设置Content-Type标头   输入并包含一个charset参数。

     

如果输入类型是XMLDOM对象,则对响应进行编码   根据&lt ;?上的编码属性XML中的XML声明   文档。

     

如果没有XML声明或编码属性,则假定为UTF-8

     

如果输入类型是UI1的SAFEARRAY,则响应按原样发送   没有额外的编码。调用者必须设置Content-Type标头   使用适当的内容类型

作为一种变通方法,您可以发送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 = Nothing