https请求Alexa技能

时间:2017-06-25 22:55:13

标签: node.js https alexa alexa-skills-kit

我似乎无法在我的alexa技能中获取HTTP请求,这里是相关的示例代码:

var https = require('https');

...

function getTreeFact(callbackFunction){


  var url = 'https://alexa.phl.chs.network/treefacts/index.php';

  https.get(url, function(res){
      var body = '';

      res.on('data', function(chunk){
          body += chunk;
      });

      res.on('end', function(){
          var gameResponse = JSON.parse(body);
          callbackFunction(gameResponse);
      });
  }).on('error', function(e){
    // Handle error
  });
}

...

this.getTreeFact(function (responseMessage){
    this.emit(':tell', responseMessage.message);
});

我不知道我做错了什么,我想我正在正确地发出HTTP请求。我知道这个技能没有这个(简单地评论最后三行,只用this.emit替换(':tell','hello')工作正常)。

4 个答案:

答案 0 :(得分:1)

让我解释一下下面的代码...这里我在“ LaunchRequest”中使用了https请求 反过来又给了我一个回应,有了这个回应,我让我的Alexa说话

注意:jsonplaceholder.typicode.com对于测试您的https请求和响应非常有用

在您的aws在线编辑器控制台中仅使用此代码,确保输入正确的意图名称和调用名称。

    exports.handler = (event, context, callback) => {
        var speechResult;
    switch (event.request.type) {

         case "LaunchRequest":
             var resultis;
             const querystring = require('querystring');                                                                                                                                                                                                
             const https = require('https');


            var postData = querystring.stringify({
                    'msg' : 'Hello World!'
            });

     var options = {
        hostname: 'jsonplaceholder.typicode.com',
        path: '/posts',
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': postData.length
     }
 };

      var req = https.request(options, (res) => {
       //console.log('statusCode:', res.statusCode);
      //console.log('headers:', res.headers);

     res.on('data', (d) => {
         //console.log("my data is "+d);
         var obj = JSON.parse(d);
         var resul = obj.msg;
         resultis = JSON.stringify(resul);
         context.succeed(generateResponse(buildSpeechletResponse(resultis, true)));
     });
 });

    req.on('error', (e) => {
        console.error(e);
    });
     req.write(postData);
        req.end();
     break;
     case "IntentRequest":
          switch (event.request.intent.name) {
        case "MyIntent":
             var a = "are you ready";
             context.succeed(generateResponse(buildSpeechletResponse(a, true)))
             break;
           }
      break;
     }
  }
       //Alexa Speech function

      buildSpeechletResponse = (outputText, shouldEndSession) => {
            return {
              outputSpeech: {
                 type: "PlainText",
                 text: outputText
              },
              shouldEndSession: shouldEndSession
          }
    }
        generateResponse = (speechletResponse) => {
              return {
                  version: "1.0",
                  response: speechletResponse
           }
     }

答案 1 :(得分:0)

Alexa的官方github页面有关于api调用的非常详尽的文档。查看他们的烹饪列表技能文档,其中包含所有获取和发布请求https://github.com/alexa/alexa-cookbook

其他样本的

https://github.com/alexa/主要回购。

答案 2 :(得分:0)

您最好使用承诺版本,例如

https://github.com/request/request-promise

答案 3 :(得分:0)

对我看起来像

this.emit(':tell', responseMessage.message);

应该是

this.emit(':tell', responseMessage);

我无法在此

中看到任何.message
var gameResponse = JSON.parse(body);

callbackFunction(gameResponse);