首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将对话流v2与javascript前端(Vue.js)集成

如何将对话流v2与javascript前端(Vue.js)集成
EN

Stack Overflow用户
提问于 2018-05-26 04:08:32
回答 3查看 4.3K关注 0票数 2

根据文档中的示例HTTP request:https://dialogflow.com/docs/reference/v2-auth-setup和detectIntent:https://dialogflow.com/docs/reference/api-v2/rest/v2beta1/projects.agent.sessions/detectIntent,我正在尝试将Dialogflow与Vue.js (和axios)集成。

我设置了一个拥有足够权限的服务账号,并为其提供了文档中所示的路径参数和请求正文,但在调用detectIntent接口时,一直收到'Error: request failed with status code 400‘。

不过,有几件事我并不确定:

  1. 如何获取sessionId?
  2. 我如何在javascript代码中实现$(gcloud auth print-access- sessionId )?目前,我正在终端中运行命令并将令牌粘贴到代码中,只是为了测试应用程序接口是否工作,但我不知道应该如何实现它。

(也许有用的是,我在functions文件夹中设置了fulfillment,并且运行良好。)

提前感谢!

代码语言:javascript
复制
<script>
import axios from 'axios'

export default {
  name: 'myChatBot',
  mounted () {

    // Authorization: Bearer $(gcloud auth print-access-token)
    
    const session = 'projects/mychatbot/agent/sessions/some-session-id'
    const token = 'xxxxxxxxxxxx'
    axios.defaults.baseURL = 'https://dialogflow.googleapis.com'
    axios.defaults.headers.common['Authorization'] = `Bearer ${token}`
    axios.defaults.headers.post['Content-Type'] = 'application/json'
    
    axios
      .post(`/v2beta1/${session}:detectIntent`, {
        "queryInput": {
          "text": "add buy milk to inbox",
          "languageCode": "en-US"
        }
      })
      .then(response => console.log(response))
      .catch(error => console.log(error))
  }

}
</script>

EN

回答 3

Stack Overflow用户

发布于 2018-05-31 04:25:48

您可以使用JWT授权来处理您的第二个问题。你只需要把你的JSON文件放在安全的地方。https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt-auth

您得到代码400的原因是因为您的参数有点不正确。下面是你的帖子应该是什么样子(我还添加了一些额外的代码来处理令牌生成):

代码语言:javascript
复制
<script>
import axios from 'axios'
import { KJUR } from 'jsrsasign'

const creds = require('./YOUR_JSON_FILE')  

export default {
  name: 'myChatBot',
  data() {
    return {
      token: undefined,
      tokenInterval: undefined
    }
  },
  created() {
    // update the tokens every hour
    this.tokenInterval = setInterval(this.generateToken, 3600000)
    this.generateToken()
  },
  mounted () {
    this.detectIntent('add buy milk to inbox')
  },
  beforeDestroy() {
    clearInterval(this.tokenInterval)
  },
  methods: {
    generateToken() {
      // Header
      const header = {
        alg: 'RS256',
        typ: 'JWT',
        kid: creds.private_key_id
      }

      // Payload
      const payload = {
        iss: creds.client_email,
        sub: creds.client_email,
        iat: KJUR.jws.IntDate.get('now'),
        exp: KJUR.jws.IntDate.get('now + 1hour'),
        aud: 'https://dialogflow.googleapis.com/google.cloud.dialogflow.v2.Sessions'
      }
      
      const stringHeader = JSON.stringify(header)
      const stringPayload = JSON.stringify(payload)
      this.token = KJUR.jws.JWS.sign('RS256', stringHeader, stringPayload, creds.private_key)
    },
    detectIntent(text, languageCode = 'en-US') {
      if (!this.token) {
        // try again
        setTimeout(this.detectIntent, 300, text, languageCode)
        return
      }
      
      // error check for no text, etc.

      const session = 'projects/mychatbot/agent/sessions/some-session-id'
      axios.defaults.baseURL = 'https://dialogflow.googleapis.com'
      axios.defaults.headers.common['Authorization'] = `Bearer ${this.token}`
      axios.defaults.headers.post['Content-Type'] = 'application/json'

      axios
        .post(`/v2beta1/${session}:detectIntent`, {
          queryInput: {
            text: {
              text,
              languageCode
            }
          }
        })
        .then(response => console.log(response))
        .catch(error => console.log(error))
    }
  }
}
</script>

您可以看到,在QueryInput中,它接受3种不同类型的对象中的1种(“文本”就是其中之一)。

票数 4
EN

Stack Overflow用户

发布于 2020-04-21 05:49:25

link中,在HTTP request session path参数下声明:“由API调用者选择合适的会话id。它可以是一个随机数,也可以是某种类型的用户标识符(最好是散列的)。

对于与Dialogflow V2的集成,这里有一个使用第三方工具的example,这些工具易于集成和开始使用。

票数 2
EN

Stack Overflow用户

发布于 2018-05-30 03:13:01

sessionId是您可以提供的标识符,它将向Dialogflow指示后续请求是否属于用户交互(see docs)的相同“会话”。

对于客户端对API的第一次请求,您可以只生成一个随机数作为会话ID。对于来自同一客户端的后续请求(例如,如果用户继续与您的代理交谈),您可以重用相同的数字。

您的令牌管理实现看起来很好,只要您使用的服务帐户具有适当的有限访问权限(因为此令牌可能允许任何人向Google Cloud API发出请求)。为了提高安全性,您可以考虑通过您自己的服务器将请求代理到Dialogflow,而不是从客户端进行调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50536189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档