如何使用简单的ajax jQuery对DialogFlow V2进行http调用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用简单的ajax jQuery对DialogFlow V2进行http调用?相关的知识,希望对你有一定的参考价值。

在使用简单的jquery之前我一直在使用DialogFlow v1,它非常直接的工作!

既然我必须切换到V2,我仍然坚持如何保持某种方式相同的代码,但只是修改V2!

我一直在看这个V2的客户端库:https://github.com/dialogflow/dialogflow-nodejs-client-v2#using-the-client-library

但我不想使用Node.js我只是不想做节点server.js来运行应用程序,我也不确定我是否可以将jQuery与Node.js混合使用。

我之前的代码v1看起来像这样:

fetch(url, {
    body: JSON.stringify(data),
    // cache: 'no-cache',
    // credentials: 'same-origin',
    headers: {
        'content-type': 'application/json',
        "Authorization": "Bearer " + configs.accessToken,
    },
    method: 'POST',
    mode: 'cors',
    redirect: 'follow',
    referrer: 'no-referrer',
})
    .then(response => response.json()) // parses response to JSON

好吧,我为ES6提出了对话流的http请求,但是我希望用相同的代码用于V2,这可能吗?此外,我再也看不到v2的访问令牌,我们如何处理http调用的auth?

我真的很困惑新的V2,因为我们切换到企业版帐户,我们必须使用v2,它有点糟糕!

编辑:我正在从文档中检查此示例:

  POST https://dialogflow.googleapis.com/v2beta1/projects/project-name/agent/intents

    Headers:
    Authorization: Bearer $(gcloud auth print-access-token)
    Content-Type: application/json

    POST body:
    {
        'displayName': 'StartStopwatch',
        'priority': 500000,
        'mlEnabled': true,
        'trainingPhrases': [
            {
                'type': 'EXAMPLE',
                'parts': [
                    {
                        'text': 'start stopwatch'
                    }
                ]
            }
        ],
        'action': 'start',
        'messages': [
            {
                'text': {
                    'text': [
                        'Stopwatch started'
                    ]
                }
            }
        ],
    }

但我在某种程度上混淆了这一部分:Authorization: Bearer $(gcloud auth print-access-token)我在哪里获得访问令牌?

我已经完成了这个部分:gcloud auth activate-service-account --key-file =我不知道激活后它做了什么!我希望我能从这里获得一些访问令牌,但似乎没有任何消息说明激活服务...

答案

首先,Dialogflow V1 API不会很快消失。他们没有明确的时间表来阻止API。如果他们决定,开发人员将在截止日期前得到通知(由他们的支持团队确认)。我想你应该可以使用到那时。

但是,如果您决定使用Dialogflow V2 API和浏览器AJAX一样,除非您拥有访问令牌,否则没有简单的方法。我遇到了同样的问题并且发现如果不使用他们的客户端库(SDK)或“google-oauth-jwt”就无法完成。在我的例子中,我使用了nodejs - google-oauth-jwt包,它为我的应用程序提供了“访问令牌”,用于浏览器AJAX调用。您不必使用他们的nodejs SDK库,以防您在客户端处理逻辑。

设置说明:

1.在对话框帐户上配置V1的V2 API,按照迁移指南进行操作。下载具有唯一电子邮件和密钥值的JSON文件。您可能希望通过注册域来授予对应用程序的访问权限。

2.创建nodejs应用程序并使用“google-oauth-jwt”获取访问令牌。此外,在进行任何ajax调用之前,将其作为一项服务,以便事先调用它以使访问令牌准备就绪。这是示例代码:

app.get("/your_sample_web_service_to_get_access_token", (req, res, next) => {
new Promise((resolve) => {
    tokens.get({
            //find this email value from the downloaded json
            email: 'xxx@xxx.iam.gserviceaccount.com',
            //find this key value from the downloaded json
            key: '-----BEGIN PRIVATE KEY-----xxx',
            //specify the scopes you wish to access: as mentioned in dialogflow documentation
            scopes: ['https://www.googleapis.com/auth/cloud-platform']
        },
        (err, token) => {
            //rest api response
            res.json({
                "access_token": token
            });
            resolve(token);
        }
    );
});
});

3.从您的客户端javascript,使用从nodejs应用程序上面获得的访问令牌进行AJAX调用。以下是示例代码:

app.service('chatbot', function ($http, $rootScope) {
    this.callAPI = function (user_entered_query) {
        //I used detectintent REST API endpoint: find the project name from your account.
        var endpoint = "https://dialogflow.googleapis.com/v2/projects/xxx/agent/sessions/123456789:detectIntent";
        var data = JSON.stringify({queryParams:{}, query_input:{text:{text:user_entered_query,language_code:"en-US"}},outputAudioConfig:{},inputAudio:""});
        var headers = {
            //use the token from nodejs service
            "Authorization": "Bearer " +$rootScope.token
        };
        return $http.post(_url, _data, {"headers": headers});
    }
});

以上是关于如何使用简单的ajax jQuery对DialogFlow V2进行http调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何应用 jQuery 动态加载的内联和/或外部 CSS

jquery easyui dialog 如何将对话框,显示在特定的位置?

asp.net 中的 jQuery UI 对话框和 Ajax POST

jquery ui dialog ui-widget-overlay 高度问题

如何在 C# 代码中使用 jQuery dialog() 而不是 confirm()?

Ajax全局加载框(Loading效果)的配置