我们正在使用node. js向客户发送SMS,最近还添加了状态回调来记录已发送和已交付的状态。我们现在还在Twilio日志中看到大量11200个显然成功的调用错误。查看调试器,我在响应正文中看到了这一点:
Twilio无法从以下位置获取内容:https://api.mycompany.com:443/api/1.0/sms/response错误:读取响应时出错:响应不包含内容类型
并且消息文本具有:
msg"请求StatusCallbackURL不成功。"httpResponse"502"
在我们这边, /api/1.0/sms/response的处理程序获取与响应一起发送的MessageSid,将其与数据库中的一个匹配,然后查看MessageStatus。对于“已发送”,它会在已发送字段中记录当前时间并将其保存回数据库,同样用于交付。最后,它只执行一个res. end(),如node.js示例所示。
这是代码:
app.post('/api/1.0/sms/response', function(req, res) {
var post_id = req.body.MessageSid || "";
var status = req.body.MessageStatus || "";
var item = Item.create(globals);
if (post_id === "") {
globals.logger.error(moduleName, "POST sms/response", "Missing MessageSid: " + JSON.stringify(req.body), true);
res.end();
return;
}
item.loadFromPostId(post_id).then(function() {
if (status.toLowerCase() === "sent") {
item.sent = new Date();
}
else if (status.toLowerCase() === "delivered") {
item.delivered = new Date();
}
item.save().then(function() {
res.end();
});
});
});
查看几个错误,它们是Twilio试图向我们发送“已交付”状态时的错误。从这些错误中检查我们的数据库中的MessageSids,匹配项在“已交付”列中有一个时间戳,因此它一直通过代码保存。
对于这个endpoint,我们的nginx日志(我们在node前面使用)中只有200个响应,没有上游超时,也没有502s。所以我不知道这个错误是从哪里来的,或者如何摆脱它。
是的,我们应该处理未交付等。,但这只是获得一些回复的快速通道。
您应该回复HTTP状态代码204:
res.status(204).end();
204状态仍然是成功的,就像200一样,但具体来说意味着您没有将任何内容发送回(https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)。请注意,以下内容也有效,并且不需要end():
res.sendStatus(204);
Twilio开发者布道者在这里。
首先,你在这里没有什么可担心的。正如你所说,你正在接收回调并做你需要做的事情。不过,您可能想停止调试器图标在Twilio控制台中向您闪烁。
据我所知,这是您链接到的Node. js示例中的一个小疏忽。
只要调用res. end()
就会关闭流。看起来,如果没有设置其他内容,这意味着响应将获得200的状态码并且没有body。虽然Twilio不期望像这样的回调响应,但它似乎仍然想知道发生了什么。
错误消息说响应没有内容类型。您可以通过在调用res. end()
之前调用res.set('Content-Type','text/平原')
在响应上设置内容类型来解决这个问题,这似乎让TwilioHTTP客户端很满意。
或者,您可以使用快速响应方法sendStatus
在一次调用中设置响应的状态和内容类型。只需调用res. sendStatus(200)
,响应将被设置为text/平原
,状态将为200,并且会有一个“OK”体。TwilioHTTP客户端将很乐意接受所有这些。
我建议您将对res. end()
的调用更改为res.sendStatus(200)
,我也将在Node.js示例中修复它。