0

我正在使用 CitectSCADA 的 CitectVBA 环境通过对象向 Twilio 的 Twimlets 服务器发出 POST 请求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请求参数提供的输入对 XML 字符具有有效的 URL 编码,但我得到的响应表明这些代码作为其相应的 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 呼叫操作员的电话并读取当前活动警报的代码!

更新:我刚刚通过Hurl.it运行了我的 POST 请求,并确认 Twilio 正确接收了它 - 呼叫通过我的手机并按请求读取了 Twimlet 编码的消息。所以问题出在Msxml2.XMLHTTP. 关于我如何解决这个问题的任何想法?

更新 2: 编码“<” 和“>”同时通过 HTTP Post 发送 XML解决了最初的 POST 错误:我已经更新了我的请求标头。

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

但是,现在我收到一条回复说没有指定“To”号码:

<?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.1Msxml2.XMLHTTP有什么想法吗?

4

1 回答 1

0

看起来您发布的TwiMLURL内容不像是经过编码的。您发布到 的返回值GetCallURL()

http.Open "POST", GetCallURL(), False, ACCOUNTSID, AUTHTOKEN
于 2018-04-30T18:05:31.880 回答