通过 API-KEY 使用来自外部 API 的数据的 Alexa 技能

Posted

技术标签:

【中文标题】通过 API-KEY 使用来自外部 API 的数据的 Alexa 技能【英文标题】:Alexa skill that uses data from an external API with API-KEY 【发布时间】:2019-11-24 16:40:45 【问题描述】:

我尝试使用在 node.js 8.1 上运行的 lambda 从 alexa 后端代码访问外部 API,该代码可以访问任何不需要 api-key 但我无法找到包含我的授权的端点( api-key)在代码中,所以我可以检索我正在寻找的数据。 我试图访问的api文档如下:

curl --request GET -H 'Authorization: Bearer' -H 'Content-Type: application/json' "https://some-end-point/path/i/want"

这是用于 alexa-skills-kit,它在调用技能后使用 lambda 并尝试使用 api-key 访问外部 api。代码可以将信息检索到不需要任何密钥的任何端点。 我已经尝试将密钥作为参数包含在 URL(api 密钥 + URL)中,因为我是 alexa、lambda、nodejs 的新手,我不知道如何调试它,但我只是没有得到想要的输出(这是 alexa 转动文本与从外部 api 获得的信息进行对话)。

pd:假设我的 api 密钥是:xxxx-xxxx-xxxx

// endpoint that i want
url = https://some-end-point/path/i/want

await getRemoteData(url)
      .then((response) => 
        const data = JSON.parse(response);
        outputSpeech = `the data thati want is $data.records.length `;
        for (let i = 0; i < data.records.length; i++) 
          if (i === 0) 
            //first record
            outputSpeech = outputSpeech + data.records[i].fields.name + ', '
           else if (i === data.records.length - 1) 
            //last record
            outputSpeech = outputSpeech + 'y '+data.records[i].fields.name + 
             ', '
           else 
            //middle record(s)
            outputSpeech = outputSpeech + data.records[i].fields.name + ', '
          
        
      )



//function getRemoteData
const getRemoteData = function (url) 
  return new Promise((resolve, reject) => 
    const client = url.startsWith('https') ? require('https') : require('http');
    const request = client.get(url,(response) => 
      if (response.statusCode < 200 || response.statusCode > 299) 
        reject(new Error('Failed with status code: ' + response.statusCode));
      
      const body = [];
      response.on('data', (chunk) => body.push(chunk));
      response.on('end', () => resolve(body.join('')));
    );
    request.on('error', (err) => reject(err))
  )
;

上面的代码可以无错误地访问任何端点,但我不知道如何包含 api 密钥以便它可以访问 api,预期的输出是通过包含 api-key 来访问 api

对于这个问题的任何帮助都将很高兴得到这个新手的帮助......

【问题讨论】:

【参考方案1】:

您需要传递一个options 对象作为client.get 的第二个参数。例如:

const options = 
  headers: 
    'Authorization': 'Bearer <your API key>'
  


然后你在哪里提出请求:

const request = client.get(url, options, (response) => 
  // Do the rest of your stuff here...  

您可以在optionshere找到更多详细信息。

【讨论】:

以上是关于通过 API-KEY 使用来自外部 API 的数据的 Alexa 技能的主要内容,如果未能解决你的问题,请参考以下文章

Django:将来自外部 API 的数据映射到模型中?

vision-client 不支持 api-key

没有 api-key 错误信息

Grafana 配置 API-KEY 实现免密 “裸奔”

Django:项目使用来自 REST API 的数据,如何在这个系统中使用外部应用程序?

在发出 POST 请求之前等待来自外部 API 的数据