Запрос API в выполнении Dialogflow (Javascript)
Поэтому я пытаюсь выполнить действие 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();
}
Код работал нормально на моем сайте, но как только я добавил его в Dialogflow, он выдал бы ошибку
XMLHttpRequest не определен
Очевидно, это произошло потому, что я никогда не определял это (используя var
), кроме того, что он работал без меня, ничего не делая. Итак, я попытался добавить эту строку
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
к коду, и он перестал выдавать мне ошибку (потому что я определил XMLHttpRequest). Но тогда мой код не будет работать.
TL; DR: Как я могу сделать внешний вызов API, используя выполнение Dialogflow?
0 ответов
Ты можешь использовать 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);
}
);
Эта статья - бриллиант! Это действительно помогло прояснить, что происходит и что требуется в полнофункциональной версии 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);
});
});
}