根据文档中的示例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‘。
不过,有几件事我并不确定:
(也许有用的是,我在functions文件夹中设置了fulfillment,并且运行良好。)
提前感谢!
<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>
发布于 2018-05-31 04:25:48
您可以使用JWT授权来处理您的第二个问题。你只需要把你的JSON文件放在安全的地方。https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt-auth
您得到代码400的原因是因为您的参数有点不正确。下面是你的帖子应该是什么样子(我还添加了一些额外的代码来处理令牌生成):
<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种(“文本”就是其中之一)。
发布于 2020-04-21 05:49:25
发布于 2018-05-30 03:13:01
sessionId
是您可以提供的标识符,它将向Dialogflow指示后续请求是否属于用户交互(see docs)的相同“会话”。
对于客户端对API的第一次请求,您可以只生成一个随机数作为会话ID。对于来自同一客户端的后续请求(例如,如果用户继续与您的代理交谈),您可以重用相同的数字。
您的令牌管理实现看起来很好,只要您使用的服务帐户具有适当的有限访问权限(因为此令牌可能允许任何人向Google Cloud API发出请求)。为了提高安全性,您可以考虑通过您自己的服务器将请求代理到Dialogflow,而不是从客户端进行调用。
https://stackoverflow.com/questions/50536189
复制相似问题