Twiml POST请求上的空参数

时间:2016-01-28 21:06:42

标签: node.js rest meteor twilio twiml

一点背景。我有一个正在运行的Web应用程序试图从Twilio接收传入的文本。我已经配置了Twilio的sms twiml url指向我的应用程序中的路线:

http://my-app-name.com/api/twiml

我在请求完成后执行了一些代码:

if (Meteor.server) {
    // use picker to make a server side route
    Picker.route('/api/twiml', (params, req, res, next) => {
        console.log(util.inspect(params, {showHidden: true, colors: true}));
        console.log(util.inspect(req.body, {showHidden: true, colors: true}));

        // message data (not populating?)
        let messageSid = params.query.MessageSid,
            accountSid = params.query.AccountSid,
            from = params.query.From,
            to = params.query.To,
            body = params.query.Body;

        //console.log(messageSid + '\n' + accountSid + '\n' + from + '\n' + to + '\n' + body)

        //from = '+' + from.trim();
        //to = '+' + to.trim();

        let responseBody = 'Thanks';

        res.writeHeader(200, {'Content-Type': 'application/xml'});

        return '<?xml version="1.0" encoding="UTF-8"?><Response><Sms from="[TWILIOFROM]" to="[TO]">[BODY]</Sms></Response>'
            .replace('[TWILIOFROM]', myNumber)
            .replace('[TO]', from)
            .replace('[BODY]', responseBody);
    });
}

当我发送我的twilio号码时代码运行但我的Twilio日志中出现11200 HTTP retrieval failure错误。我的应用日志正在输出第一个console.log,但我没有从params.query收到任何数据。

{ query: {} }

第二个console.log:console.log(util.inspect(req.body, {showHidden: true, colors: true}));吐出一些垃圾:[90mundefined[39m

我应该放弃参数并尝试解析请求体吗?

我对REST api非常陌生,所以我确信我错过了一些非常基本的东西。

1 个答案:

答案 0 :(得分:1)

Twilio开发者传道者在这里。

当Twilio POST到您配置的短信网址时,parameters are sent as the body of the request,而不是查询字符串参数。

我对Picker不是很熟悉,而是documentation suggests you can use Express middleware,包括body-parser。如果您使用req.body连接Picker,那么您应该能够从body-parser获取参数。这样的事情可能有用(注意第2和第3行,包括if (Meteor.server) { var bodyParser = Meteor.npmRequire( 'body-parser'); Picker.middleware( bodyParser.urlencoded( { extended: false } ) ); // use picker to make a server side route Picker.route('/api/twiml', (params, req, res, next) => { console.log(util.inspect(params, {showHidden: true, colors: true})); console.log(util.inspect(req.body, {showHidden: true, colors: true})); // message data (not populating?) let messageSid = req.body.MessageSid, accountSid = req.body.AccountSid, from = req.body.From, to = req.body.To, body = req.body.Body; //console.log(messageSid + '\n' + accountSid + '\n' + from + '\n' + to + '\n' + body) //from = '+' + from.trim(); //to = '+' + to.trim(); let responseBody = 'Thanks'; res.writeHeader(200, {'Content-Type': 'application/xml'}); let twiml = '<?xml version="1.0" encoding="UTF-8"?><Response><Sms from="[TWILIOFROM]" to="[TO]">[BODY]</Sms></Response>' .replace('[TWILIOFROM]', myNumber) .replace('[TO]', from) .replace('[BODY]', responseBody); res.end(twiml); }); } ):

res.send

让我知道这是否有帮助。

编辑:我认为,您实际上需要使用{{1}}将其发送到响应对象,而不是返回TwiML。我已经更新了上面的代码。