通过Node.js中的AWS Lambda发送POST请求
当从我的Alexa技能中调用意图时,我想向Twilio发送一个POST请求。测试代码时,没有错误,但请求似乎没有通过。在Postman works中测试POST请求通过Node.js中的AWS Lambda发送POST请求,node.js,aws-lambda,alexa,Node.js,Aws Lambda,Alexa,当从我的Alexa技能中调用意图时,我想向Twilio发送一个POST请求。测试代码时,没有错误,但请求似乎没有通过。在Postman works中测试POST请求 function postToTwilio() { var http = require("https"); var postData = JSON.stringify({ 'To' : '1234567', 'From': '1234546', 'Url': 'https://handler.
function postToTwilio() {
var http = require("https");
var postData = JSON.stringify({
'To' : '1234567',
'From': '1234546',
'Url': 'https://handler.twilio.com/twiml/blablabla',
});
var options = {
"method": "POST",
"hostname": "https://api.twilio.com",
"path": "/12344/Accounts/blablablablba/Calls.json",
"headers": {
"Authorization": "Basic blblablablablabla",
"Content-Type": "application/x-www-form-urlencoded",
}
};
var req = http.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
console.log(body.toString());
});
});
req.write(postData);
req.end();
}
首先,请求是一个异步调用,因此需要让alexa等待响应 要做到这一点,您需要使用异步等待过程并使用承诺
var postData = JSON.stringify({
'To' : '1234567',
'From': '1234546',
'Url': 'https://handler.twilio.com/twiml/blablabla',
});
var options = {
"method": "POST",
"hostname": "https://api.twilio.com",
"path": "/12344/Accounts/blablablablba/Calls.json",
"headers": {
"Authorization": "Basic blblablablablabla",
"Content-Type": "application/x-www-form-urlencoded",
}
};
function get(options) {
return new Promise(((resolve, reject) => {
const request = https.request(options, (response) => {
response.setEncoding('utf8');
let returnData = '';
if (response.statusCode < 200 || response.statusCode >= 300) {
return reject(new Error(`${response.statusCode}: ${response.req.getHeader('host')} ${response.req.path}`));
}
response.on('data', (chunk) => {
returnData += chunk;
});
response.on('end', () => {
resolve(JSON.parse(returnData));
});
response.on('error', (error) => {
reject(error);
});
});
request.write(postData)
request.end();
}));
}
var postData=JSON.stringify({
“至”:“1234567”,
‘From’:‘1234546’,
“Url”:”https://handler.twilio.com/twiml/blablabla',
});
变量选项={
“方法”:“发布”,
“主机名”:”https://api.twilio.com",
“路径”:“/12344/Accounts/blablba/Calls.json”,
“标题”:{
“授权”:“基本BLBLBLA”,
“内容类型”:“应用程序/x-www-form-urlencoded”,
}
};
函数get(选项){
返回新承诺(((解决、拒绝)=>{
const request=https.request(选项,(响应)=>{
response.setEncoding('utf8');
让returnData='';
如果(response.statusCode<200 | | response.statusCode>=300){
返回拒绝(新错误(`response.statusCode}:${response.req.getHeader('host')}${response.req.path}');
}
response.on('data',(chunk)=>{
returnData+=chunk;
});
响应。在('end',()=>{
解析(JSON.parse(returnData));
});
响应.on('error',(error)=>{
拒绝(错误);
});
});
请求.写入(postData)
request.end();
}));
}
然后,当调用此get函数时:
let response=wait get(选项)
我还没有作为一个整体进行测试,但这是基本骨架
让我知道这是否有效。您在
req
上没有错误处理程序,请尝试在那里添加一个,然后查看是否报告了任何错误。如书面所述,他们可能只是没有得到处理。有关更多信息,请参阅。我认为您的Lambda功能已在post请求完成之前完成,请显示您在何处使用posttowilio
函数和调用回调函数。嘿,感谢您的回复!我复制了你做的一切。只有一个问题,当调用get函数(让response=await api.get(options)时,我应该输入什么而不是“api”?我得到了一条消息:“意外的令牌api”对不起,刚刚调用了get(…)。我通常在外部类中调用该函数,所以我总是将其作为api调用。无论答案如何更新