У меня есть простая функция 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>
Если я отправлю это с помощью подключаемого модуля Postman в Chrome, оно будет обработано без проблема. При публикации с кодом 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
, но вы не кодируете URL-адрес полезной нагрузки XML. - person Tim Williams   schedule 17.04.2018setRequestHeader
, по-прежнему дает то же самоеError: Whitespace expected at Line: 1 Position: 19
- person Tim   schedule 17.04.2018sXML = sXML & ...
. Попробуйте добавить& chr(10)
в точках новой строкой. Возможно, в символе 19, как говорится в сообщении об ошибке, и посмотрите, говорит ли он вам, что он ожидал пробела в индексе нового символа. - person chillin   schedule 17.04.2018sXML
перед использованием.send
(попробуйтеApplication.EncodeURL(sXML)
), чтобы его содержимое не было повреждено во время передачи, и при сохранении заголовка запросаapplication/x-www-form-urlencoded
. - person chillin   schedule 17.04.2018Application.EncodeURL
мне недоступен, и я намерен портировать его на VBScript для запуска по расписанию. Задача. Я видел несколько фрагментов строк кодирования HTML/URL в других сообщениях. Я попробую. - person Tim   schedule 17.04.2018