Msxml2.XMLHTTP делает нежелательный перевод кодировки URL? - PullRequest
0 голосов
/ 30 апреля 2018

Я использую среду CitectSCADA CitectVBA, чтобы сделать POST-запрос к серверу Twimio Twilio через объект Msxml2.XMLHTTP. Обнаружив некоторые различия между этим и Office VBA v6, мне удалось заставить его выполнить запрос POST.

Dim TwiMLURL As String
TwiMLURL = "http://twimlets.com/echo?Twiml=%3CResponse%3E%0A%3CSay%3EThis%20Is%20a%20test.%20Say%20Alarm%20Trip%20" _
& almNum &".%3C%2FSay%3E%0A%3C%2FResponse%3E&"

Dim http As Object
Set http = CreateObject("Msxml2.XMLHTTP")

http.Open "POST", GetCallURL(), False, ACCOUNTSID, AUTHTOKEN
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

Dim postData As Variant
postData = "From=" & TwilioNumber _
    & "&To=" & toNumber _
    & "&Url=" & TwiMLURL

' send the POST data
Print postData
http.send postData

Проблема, с которой я столкнулся сейчас, заключается в том, что входные данные, которые я предоставляю для параметра Url запроса, имеют допустимую кодировку URL для символов XML, но полученный мной ответ указывает, что эти коды прошли как их соответствующий HTML Коды символов амперсанда.

Мой вывод для кода выше:

The thread 1 has started.
From=+15555556430&To=+15555551597&Url=http://twimlets.com/echo?Twiml=%3CResponse%3E%0A%3CSay%3EThis%20Is%20a%20test.%20Say%20Alarm%20Trip%20111.%3C%2FSay%3E%0A%3C%2FResponse%3E&
<?xml version='1.0' encoding='UTF-8'?><TwilioResponse><RestException><Code>21205</Code><Message>Url is not a valid url: http://twimlets.com/echo?Twiml=&lt;Response&gt;&lt;Say&gt;This Is a test. Say Alarm Trip 111.&lt;/Say&gt;&lt;/Response&gt;</Message><MoreInfo>https://www.twilio.com/docs/errors/21205</MoreInfo><Status>400</Status></RestException></TwilioResponse>
The thread 1 has terminated.

Есть идеи о том, где происходит перевод? Я так близок к тому, чтобы заставить Citect звонить на телефон оператора и читать код активной в данный момент тревоги!

ОБНОВЛЕНИЕ: Я только что выполнил свой запрос POST через Hurl.it и подтвердил, что Twilio получил его правильно - звонок прошел на мой телефон и прочитал закодированное в Twimlet сообщение как просил. Так что проблема с Msxml2.XMLHTTP. Любые мысли о том, как я мог бы обойти это?

ОБНОВЛЕНИЕ 2: Кодирование «<» и «>» при отправке XML через HTTP-сообщение решило начальную ошибку POST: я обновил заголовок моего запроса.

http.setRequestHeader "Content-Type", "text/xml; charset=""utf-8"""

Однако теперь я получаю ответ о том, что номер «Кому» не указан:

<?xml version='1.0' encoding='UTF-8'?><TwilioResponse><RestException><Code>21201</Code><Message>No 'To' number is specified</Message><MoreInfo>https://www.twilio.com/docs/errors/21201</MoreInfo><Status>400</Status></RestException></TwilioResponse>

Мои номера телефонов отформатированы как %2B15555556430. Здесь есть еще одна проблема кодирования? Я даже не знаю, как выяснить, что Msxml2.XMLHTTP отправляет на этот раз.

ОБНОВЛЕНИЕ 3: Проблема с MSXML2.XMLHTTP. Когда я отправляю свои данные в httpbin.org / post , чтобы они отражали то, что я отправил, они возвращают следующие объекты, в зависимости от того, какой заголовок Content-Type я выберу:

С text/xml; charset=""utf-8"":

"args": {}, 
"data": "From=%2B15555556430&To=%2B15555551597&Url=http://twimlets.com/echo?Twiml=%3CResponse%3E%0A%20%20%3CSay%3EM%20G%20141%20E%20Q%20P%20S%20A%20Alarm%20Trip%20111%3C%2FSay%3E%0A%3C%2FResponse%3E&", 
"files": {}, 
"form": {},

С application/x-www-form-urlencoded:

"args": {}, 
"data": "", 
"files": {}, 
"form": {
    "From": "+15555556430", 
    "To": "+15555551597", 
    "Url": "http://twimlets.com/echo?Twiml=<Response>\n  <Say>M G 141 E Q P S A Alarm Trip 111</Say>\n</Response>"
},

С application/json:

"args": {}, 
"data": "From=%2B15555556430&To=%2B15555551597&Url=http://twimlets.com/echo?Twiml=%3CResponse%3E%0A%20%20%3CSay%3EM%20G%20141%20E%20Q%20P%20S%20A%20Alarm%20Trip%20111%3C%2FSay%3E%0A%3C%2FResponse%3E&", 
"files": {}, 
"form": {},

Я на самом деле пытался заменить WinHttp.WinHttpRequest.5.1 вместо Msxml2.XMLHTTP и получил точно такие же результаты. Есть мысли?

1 Ответ

0 голосов
/ 30 апреля 2018

Не похоже, что вы публикуете на TwiMLURL, который выглядит закодированным. Вы отправляете на возвращаемое значение GetCallURL().

http.Open "POST", GetCallURL(), False, ACCOUNTSID, AUTHTOKEN
...