Запрос API в выполнении Dialogflow (Javascript) - PullRequest
0 голосов
/ 03 марта 2019

Поэтому я пытаюсь выполнить действие Google с использованием Dialogflow, для которого требуется внешний API.Я всегда использовал jQuery .getJSON() для выполнения вызовов API, поэтому я понятия не имел, как это сделать.После поиска в Интернете я нашел способ сделать это, используя ванильный javascript (я также протестировал способ на своем веб-сайте, и он работал нормально).Код для этого приведен ниже:

function loadXMLDoc() {
  var xmlhttp = new XMLHttpRequest();

  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == XMLHttpRequest.DONE) {
      console.log(xmlhttp.responseText);
    }
  };

  xmlhttp.open("GET", "https://translate.yandex.net/api/v1.5/tr.json/translate?lang=en-es&key=trnsl.1.1.20190105T052356Z.7f8f950adbfaa46e.9bb53211cb35a84da9ce6ef4b30649c6119514a4&text=eat", true);
  xmlhttp.send();
}

Код отлично работал на моем веб-сайте, но как только я добавил его в диалог, он выдал бы ошибку

XMLHttpRequest не определен

Очевидно, это произошло потому, что я никогда не определял его (используя var), за исключением того, что оно работало без моего участия.Затем я попытался добавить эту строку

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

в код, и она перестала выдавать мне ошибку (потому что я определил XMLHttpRequest).Но тогда мой код не будет работать.

TL; DR: Как выполнить внешний вызов API с использованием выполнения Dialogflow?

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Эта статья является бриллиантом!Это действительно помогло прояснить, что происходит и что требуется в полнофункциональных диалогах Dialogflow.

Небольшое предложение состоит в том, чтобы изящно отловить ошибку при подключении к веб-сервису:

      function weatherAPI() {
        const url = "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22";

        return new Promise((resolve, reject) => {

            https.get(url, function(resp) {
                var json = "";
                resp.on("data", function(chunk) {
                    console.log("received JSON response: " + chunk);
                    json += chunk;
                });

                resp.on("end", function() {
                    let jsonData = JSON.parse(json);
                    let chat = "The weather is " + jsonData.weather[0].description;
                    resolve(chat);
                });

            }).on("error", (err) => {
                reject("Error: " + err.message);
            });

        });
      }
0 голосов
/ 05 марта 2019

Вы можете использовать https.Но убедитесь, что вы переходите на Blaze Pay (или любые другие планы) для выполнения внешних вызовов API, в противном случае вы получите ошибку, такую ​​как

Error:
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions.

Код для выполнения внешнего вызова API,

// See https://github.com/dialogflow/dialogflow-fulfillment-nodejs
// for Dialogflow fulfillment library docs, samples, and to report issues
"use strict";

const functions = require("firebase-functions");
const { WebhookClient } = require("dialogflow-fulfillment");
const { Card, Suggestion } = require("dialogflow-fulfillment");
const https = require("https");

process.env.DEBUG = "dialogflow:debug"; // enables lib debugging statements

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(
  (request, response) => {
    const agent = new WebhookClient({ request, response });
    console.log(
      "Dialogflow Request headers: " + JSON.stringify(request.headers)
    );
    console.log("Dialogflow Request body: " + JSON.stringify(request.body));

    function getWeather() {
      return weatherAPI()
        .then(chat => {
          agent.add(chat);
        })
        .catch(() => {
          agent.add(`I'm sorry.`);
        });
    }

    function weatherAPI() {
      const url =
        "https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22";

      return new Promise((resolve, reject) => {
        https.get(url, function(resp) {
          var json = "";
          resp.on("data", function(chunk) {
            console.log("received JSON response: " + chunk);
            json += chunk;
          });

          resp.on("end", function() {
            let jsonData = JSON.parse(json);
            let chat = "The weather is " + jsonData.weather[0].description;
            resolve(chat);
          });
        });
      });
    }

    function welcome(agent) {
      agent.add(`Welcome to my agent!`);
    }

    function fallback(agent) {
      agent.add(`I didn't understand`);
      agent.add(`I'm sorry, can you try again?`);
    }

    let intentMap = new Map();
    intentMap.set("Default Welcome Intent", welcome);
    intentMap.set("Default Fallback Intent", fallback);
    intentMap.set("Weather Intent", getWeather);
    agent.handleRequest(intentMap);
  }
);
...