【发布时间】:2018-09-26 17:46:36
【问题描述】:
我有一个简单的 VBA 函数,它可以将 POST 发送到远程服务器。帖子正文是一个 XML 文档。
Sub testmessage()
Dim sXML As String, sURL As String, sResponse As String
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("MSXML2.ServerXMLHTTP")
sXML = "<?xml version=""1.0"" encoding=""ISO-8859-1""?>"
sXML = sXML & "<!DOCTYPE pnet_imessage_send PUBLIC ""-//PeopleNet//pnet_imessage_send"""
sXML = sXML & " ""http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd""> "
sXML = sXML & "<pnet_imessage_send>"
sXML = sXML & " <cid>20</cid>"
sXML = sXML & " <pw>password</pw>"
sXML = sXML & " <vehicle_number>123</vehicle_number>"
sXML = sXML & " <deliver>now</deliver>"
sXML = sXML & " <freeform_message>This is Tim's test message.</freeform_message>"
sXML = sXML & "</pnet_imessage_send>"
'Test url'
'sURL = "https://open.pfmlogin.com/scripts/postp.dll"
'Live url
sURL = "https://oi.pfmlogin.com/scripts/open.dll"
WinHttpReq.Open "POST", sURL, False
WinHttpReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded;Charset=ISO-8859-1"
WinHttpReq.Send sXML
sResponse = WinHttpReq.responseText
Debug.Print sResponse
End Sub
sXML 包含以下内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE pnet_imessage_send PUBLIC "-//PeopleNet//pnet_imessage_send"
"http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd">
<pnet_imessage_send>
<cid>20</cid>
<pw>password</pw>
<vehicle_number>123</vehicle_number>
<deliver>now</deliver>
<freeform_message>This is Tim's test message.</freeform_message>
</pnet_imessage_send>
如果我使用 Chrome 的 Postman plugin 发送此邮件,它会毫无问题地处理。使用 VBA 代码发布时,它会返回错误 XML failed to parse. The reported error was: File: . Line: 1 Col: 19 Error: Whitespace expected at Line: 1 Position: 19。
如果我将数据发布到测试 url(它只会反弹发布到它的任何内容),它会显示如下:
<?xml version="1.0"
encoding="ISO-8859-1"
><!DOCTYPE pnet_imessage_send PUBLIC "-//PeopleNet//pnet_imessage_send"
http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd
我相信服务器没有将换行符视为空格,导致 XML 解析器看起来像这样:<?xml version="1.0"encoding="ISO-8859-1">(“1.0”和编码之间没有空格)。使用 Postman 发布的帖子没有意外的换行符。如何在没有 VBA 分解序言的情况下发布这些数据?
【问题讨论】:
-
您的请求标头的内容类型为
application/x-www-form-urlencoded,但您没有对 XML 有效负载进行 url 编码。 -
@TimWilliams 注释掉
setRequestHeader行仍然产生相同的Error: Whitespace expected at Line: 1 Position: 19 -
您是否尝试将标头保持原样并对您的 XML 进行 URL 编码?另外 - 这里完全相同的问题(虽然不同的客户端平台)stackoverflow.com/questions/2908597/…
-
也许我遗漏了一些东西,但我没有看到您在
sXML = sXML & ...连接部分的任何地方添加新行。尝试将& chr(10)附加到带有新行的点。正如错误消息所说,可能在第 19 个字符处,看看它是否告诉您它期望在新字符索引处出现空白。
标签: xml vba serverxmlhttp