【问题标题】:ServerXMLHTTP appending to content-typeServerXMLHTTP 附加到内容类型
【发布时间】:2016-01-26 19:38:28
【问题描述】:

我正在用 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.ServerXMLHTTP 6.0 没有表现出这种行为,至少在默认情况下是这样。但我仍然想看看是否有解决方案,因为我不确定在需要安装此应用程序的地方是否可用。

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

【问题讨论】:

    标签: vbscript asp-classic http-headers


    【解决方案1】:

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

    Remarks

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

    如果输入类型是 XMLDOM 对象,则响应被编码 根据

    如果没有 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多