可以通过Alexa托管技能来调用http get吗?

时间:2019-05-03 21:41:41

标签: aws-lambda alexa alexa-skills-kit alexa-skill alexa-voice-service

我一直在尝试在Node.js端点中使用http模块来执行简单的http获取操作。

我按照我的意图执行了各种教程,但是在cloudwatch日志中使用getaddrinfo ENOTFOUND仍然会失败。

似乎我正在正确地准备url,如果我只是将url输出剪切并通过浏览器,则会得到预期的响应,并且它只是通过端口80的普通http。

我怀疑Alexa托管的lambda可能没有获得对非Amazon Web服务进行远程调用的必要权限,但是我不确定这一点。

有人可以照亮吗?仅供参考,这是我的lambda中的代码:

var http = require('http');

function httpGet(address, zip, zillowid) {
const pathval = 'www.zillow.com/webservice/GetSearchResults.htm' + `?zws-id=${zillowid}` + `&address=${encodeURIComponent(address)}&citystatezip=${zip}`;
console.log ("pathval =" + pathval);
return new Promise(((resolve, reject) => {
   var options = {
    host: pathval,
    port: 80,
    method: 'GET',
};

const request = http.request(options, (response) => {
  response.setEncoding('utf8');
  console.log("options are" + options);
  let returnData = '';

  response.on('data', (chunk) => {
    returnData += chunk;
  });

  response.on('end', () => {
    resolve(JSON.parse(returnData));
  });

  response.on('error', (error) => {
      console.log("I see there was an error, which is " + error);
    reject(error);
  });
});
request.end();
}));
}

1 个答案:

答案 0 :(得分:0)

host: pathval是对Node.js http module的错误使用。您需要提供主机名和路径+查询字符串作为两个不同的选项。

正确用法的示例:

host: 'example.com',
path: '/webservice/GetSearchResults.htm?zws-id=...',

(当然,这些可以是变量,为清楚起见,它们不必是此处显示的文字。)

发生错误是因为您将整个URL视为主机名,因此不存在。

  

我怀疑Alexa托管的lambda可能没有必要的权限来进行对非Amazon Web服务的远程调用

对于Lambda函数中可以与之联系的服务没有任何限制(除了可以防止将垃圾邮件直接发送到随机邮件服务器的过滤器之外)。