如何使用内联编辑器测试 Dialogflow Fulfillment 上的 http 请求

How to test http request on Dialogflow Fulfillment with the Inline Editor

我正在使用内联编辑器测试 Dialogflow Fulfillment。 我想要做的是使用 que 'request' 库的 http 请求。 这是我使用的代码:

const requesthttp = require('request');

requesthttp('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true }, (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(body.url);
    console.log(body.explanation);
});

但它 returns 我没有找到错误。

我还注意到我的 Dialogflow 上有一条警告,其中包含以下消息:

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

所以...可能我无法在不配置结算帐户的情况下测试这段代码。

我的问题是...是否有 url 可用于测试此代码? 或者我测试此代码的唯一方法是配置结算帐户并为其付款?

提前致谢

有很多方法可以创建您自己的服务器,例如使用带有 Express.JS 的 NodeJS 客户端,您可以使用 NGROK 作为 webhook 公开到互联网以实现。

从以下代码开始 Actions-on-Google with Express.JS

'use strict';

const {dialogflow} = require('actions-on-google');
const express = require('express');
const bodyParser = require('body-parser');

const app = dialogflow();

app.intent('Default Welcome Intent', conv => {
    conv.ask('Hi, Welcome to Assistant by Express JS ');
});

express().use(bodyParser.json(), app).listen(8080);

有多种方法可以测试您的代码。

  • 如果您想继续使用 Dialogflow 的内联编辑器,您将需要设置 Firebase 以使用付款计划。然而,Blaze plan 是 "pay as you go" 经过基本级别的使用。这种使用级别应该足以涵盖服务的大多数测试(甚至是非常轻的生产)使用,而无需收取费用。一旦您的操作获得批准,您就可以获得 Google Cloud Platform 的积分,如果您超过最低级别,这些积分可以应用于此用途。

  • 您还可以使用内联编辑器所基于的 Firebase Cloud Functions 和您自己的本地编辑器。这样做的一个优点是您可以在本地提供该功能,这与部署它具有许多相同的功能,但没有 URL 限制(毕竟这是您自己的机器)。在测试期间,您可以使用 ngrok 等工具为您的机器创建安全隧道。测试完成后,您可以使用付费计划将其部署到 Firebase。

  • 当然,您可以选择使用您希望的任何其他托管方法。 Google 和 Dialogflow 允许您在任何服务器上 运行 您的 fulfillment webhook,只要该服务器可以使用有效的非自签名证书提供 HTTPS 连接。如果您正在使用 node.js,您可以继续使用这些库。如果你想使用另一种语言,你需要能够解析 return JSON,否则你没有任何限制。

由于 DF 使用 firebase 云函数,您可以像在 nodejs 中一样使用 https。但是请求 google/firebase 宇宙之外的域将需要付费版本的 firebase。

const https = require('https');

return new Promise((resolve, reject) => {
        const hostname = info.hostname;
        const pathname = info.pathname;
        let data = '';
        const request = https.get(`https://${hostname}${pathname}`, (res) => {
            res.on('data', (d) => {
                data += d;
            });
            res.on('end', resolve);
        });
        request.on('error', reject);
    });