我正在尝试使用DialogFlow v2端点但由于某种原因我收到了未经授权的消息,事后我可以使用以下命令生成访问令牌:
最初我正在运行此命令以授权本地计算机的服务能够授权服务:gcloud auth activate-service-account --key-file=<service-account-key-file.json>
然后我通过以下命令获取访问令牌:gcloud auth print-access-token
此访问令牌我是附在以下代码上:
fetch(configs.baseUrl + "query?v=20150910", {
body: JSON.stringify({query: text, lang: "en", sessionId: "somerandomthing"}),
headers: {
'content-type': 'application/json',
"Authorization": "Bearer " + accessToken,
},
method: 'POST',
})
.then(response => response.json())
.then(data => {
console.log(data.result.fulfillment.speech);
return data.result.fulfillment.speech;
})
.catch(error => console.error(error))
我不知道这是否是与DialogFlow V2进行通信的正确方法? 如果你能让我知道我做错了什么,为什么我说我没有被授权,因为我通过上述命令授权并且能够获得访问令牌!
编辑:
经过几次更改后,我的代码最终看起来像这样:
fetch("https://dialogflow.googleapis.com/v2beta1/projects/xxx/agent/sessions/xxx/:detectIntent", {
body: JSON.stringify({queryInput: "Hello"}),
headers: {
'content-type': 'application/json',
"Authorization": "Bearer xxxx",
},
method: 'POST',
})
.then(response => response.json())
.then(data => {
console.log(data.result.fulfillment.speech);
return data.result.fulfillment.speech;
})
.catch(error => console.error(error))
我收到的新错误信息是:
{
"error": {
"code": 400,
"message": "Invalid value at 'query_input' (type.googleapis.com/google.cloud.dialogflow.v2beta1.QueryInput), \"Hello\"",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "query_input",
"description": "Invalid value at 'query_input' (type.googleapis.com/google.cloud.dialogflow.v2beta1.QueryInput), \"Saanko yhteystiedot?\""
}
]
}
]
}
}
答案 0 :(得分:2)
您没有显示您正在使用的baseUrl
,但这看起来像是V1 API而不是V2 API。你应该migrate your code to V2。
另请注意,访问令牌过期,因此您需要定期生成新的令牌。你不能要求长寿&#34;令牌(这被认为是不安全的),但是应该让你的代码在前一个到期之前调用gcloud auth print-access-token
(或使用库做同样的事情)。
更新:
queryInput
参数不直接接受字符串。必须将其设置为QueryInput object。这是一个枚举,因此只能指定一个字段集。看起来您需要text
字段,该字段需要TextInput object。
因此,您的body
参数可能会设置如下:
var body = {
queryInput: {
text: {
text: "Hello",
language: "en-US"
}
}
};
var bodyStr = JSON.stringify(body);
然后在request()
选项中设置。
答案 1 :(得分:0)
Because you have put wrong URL in your project.
Open below image and see which URL use for posturl in your project