当前位置: 首页 > 知识库问答 >
问题:

如何使用Javascript ajax调用在DialogFlow v2上进行http调用

倪子晋
2023-03-14

我在DialogFlow的官方网站上使用Node.js找到了这个示例,它运行良好,但我不知道如何将其集成到我的web应用程序中。

我可以将它集成到我的其他javascript jquery代码中吗?这里我需要运行节点index.js,但是如果我与代码集成,我还需要这样做吗?

const projectId = 'xxx'; //https://dialogflow.com/docs/agents#settings
const sessionId = 'xxxxx';
const query = 'Hello';
const languageCode = 'en-US';

// Instantiate a DialogFlow client.
const dialogflow = require('dialogflow');
const sessionClient = new dialogflow.SessionsClient();

// Define session path
const sessionPath = sessionClient.sessionPath(projectId, sessionId);
console.log(sessionPath);
// The text query request.
const request = {
  session: sessionPath,
  queryInput: {
    text: {
      text: query,
      languageCode: languageCode,
    },
  },
};

// Send request and log result
sessionClient
  .detectIntent(request)
  .then(responses => {
    console.log('Detected intent');
    const result = responses[0].queryResult;
    console.log(`  Query: ${result.queryText}`);
    console.log(`  Response: ${result.fulfillmentText}`);
    if (result.intent) {
      console.log(`  Intent: ${result.intent.displayName}`);
    } else {
      console.log(`  No intent matched.`);
    }
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

DialogFlow 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

共有1个答案

宋斌
2023-03-14

正如其他人以前在这里所说的,访问令牌有一个小时的持续时间,之后它就变得无用了。因此,为了请求访问令牌,需要对API进行一次调用(在我的例子中是http调用),每小时一次,然后按照Satheesh的解释使用它。https://developers.google.com/identity/protocols/oauth2ServiceAccount中给出了有关如何生成进行调用的签名以及以后使用该签名的说明。

一旦使用私钥和必须使用的电子邮件(不是您的电子邮件,而是由服务帐户生成的电子邮件)从服务帐户获得json文件,您就可以使用jsrsasign库(纯javascript)来生成json Web签名(JWS),从而生成json Web令牌(JWT),进行http调用以获取访问令牌所需的json Web令牌。

然后,按照上面Satheesh所描述的那样使用它,通过jQuery调用Dialogflow V2。

我用来实现这一点的代码是下一个:

function _genJWS() {
    var header = '{"alg":"RS256","typ":"JWT"}';
    var claimSet = jwtClaimSet();
    var privateKey = jwtPrivateKey();

    var sHead = newline_toDos(header);
    var head = KJUR.jws.JWS.readSafeJSONString(sHead);
    var sPayload = newline_toDos(claimSet);
    var sPemPrvKey = privateKey;

    var jws = new KJUR.jws.JWS();
    var sResult = null;
    try {
        prv = KEYUTIL.getKey(sPemPrvKey);

        sResult = KJUR.jws.JWS.sign(head.alg, sHead, sPayload, prv);
    } catch (ex) {
        alert("Error: " + ex);
    }
    return sResult;
}
function _requestAccessToken() {
    var access_token = accessToken;
    var assertion = _genJWS();
    console.log('Assertion: ' + assertion);
    jQuery.ajax({
        type: "POST",
        url: "https://www.googleapis.com/oauth2/v4/token",
        contentType: "application/x-www-form-urlencoded",
        dataType: "json",
        data: "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + assertion,
        success: function(response) {
            console.log("success");
            console.log(response);
            access_token = response.access_token;
            console.log(access_token);
        },
        error: function() {
            console.log("Error");
        }
    });
    return access_token;
}

然后使用该访问令牌对DialogFlow进行HTTP调用。

希望能有所帮助。

 类似资料:
  • 问题内容: 有什么方法可以使用AngularJS进行同步调用吗? AngularJS文档不是很明确,也不是为了找出一些基本内容而扩展。 在服务上: 问题答案: 不是现在。如果查看源代码(从2012年10月开始),您会发现对XHR open的调用实际上是硬编码为异步的(第三个参数为true): 您需要编写自己的执行同步调用的服务。通常,由于JavaScript执行的性质,您通常不需要执行此操作,最终

  • 问题内容: 我是ReactiveX for Java的新手,我有以下代码块可以进行外部http调用,但它不是异步的。我们正在使用rxjava 1.2和Java 1.8 我有以下在网上找到的代码块,但我无法完全理解它,以及如何将其应用于代码库。 问题答案: 如果我对您的理解正确,则需要使用类似的方法包装现有的内容 代码的简短说明: 它计划在 对成功案例和错误案例的转换最少。它也发生在调度程序上,但是

  • 问题内容: 好的,这里是twitter API, 任何人都可以给我有关如何使用Meteor调用此API或链接的任何提示吗 更新:: 这是我尝试过的代码,但未显示任何响应 问题答案: 您要定义checkTwitter Meteor.method 内部 客户范围的块。因为您不能从客户端调用跨域(除非使用jsonp),所以您必须将此块放在一个块中。 顺便说一句,每个文档,在客户端的checkTwitte

  • 我使用postman测试了一个API。使用postman,我设法生成了一个令牌。 从postman那里,我通过一个get请求,使用以下内容和以下详细信息获取了用户的所有数据: 在授权类型下,我选择了“无记名令牌”并将令牌粘贴在其各自的字段中。 当我单击发送时,我得到了一个用户数据的成功响应。 在PHP中,如何在PHP函数中执行相同的api调用(使用id、电子邮件和令牌)? 我试过这个: 但当我查看

  • RestTemplate文档中的Spring注意: 注意:从5.0开始,这个类处于维护模式,只接受微小的更改请求和bug。请考虑使用org.springframework.web.reactive.client.WebClient,它具有更现代的API,支持同步、异步和流场景。 https://docs.spring.io/spring-framework/docs/current/javadoc

  • 我搜索了许多网站和文档,但异步调用使用的代码相同。但不确定为什么它不起作用。如果我错过了什么,有人能帮我吗?