Dialogflow Webhook添加HTTP请求后报错:'final_response'必须设置
解决Dialogflow Webhook添加HTTP请求后出现的MalformedResponse错误
嘿,我之前在Dialogflow开发Webhook的时候也踩过这个一模一样的坑!你遇到的MalformedResponse 'final_response' must be set错误,核心问题其实是你的Webhook没有返回Dialogflow要求的正确响应结构,再加上异步HTTP请求的错误处理没做全,导致Dialogflow收不到符合规范的最终响应。
问题出在哪?
看你的代码,你在http.get的end事件里resolve("OK"),但Dialogflow的Webhook响应不能只是简单的字符串——它需要一个包含特定字段的JSON对象,用来告诉Dialogflow该给用户返回什么内容。另外,你的代码里没有处理HTTP请求可能出现的错误(比如网络问题、API返回错误),如果请求失败,Promise会一直处于pending状态,Dialogflow等不到响应也会抛出这个错误。
修正方案
我给你改一下代码,重点做两个调整:
- 构造符合Dialogflow要求的响应结构
- 完善异步请求的错误处理
function askMovie(response) { return new Promise((resolve, reject) => { http.get('http://www.omdbapi.com/?apikey=[MY_HIDDEN_API_KEY]&s=lego', res => { let raw = ''; res.on('data', chunk => raw += chunk); res.on('end', () => { // 这里构造Dialogflow期望的响应格式,用fulfillmentMessages返回文本 const finalResponse = { fulfillmentMessages: [ { text: { text: ["OK, 我已经获取到乐高相关的电影数据啦!"] } } ] }; resolve(finalResponse); }); // 处理HTTP响应过程中的错误 res.on('error', (err) => { console.error('响应错误:', err); reject(err); }); }).on('error', (err) => { // 处理HTTP请求发起时的错误 console.error('请求错误:', err); reject(err); }); }); }
额外注意事项
- 如果你的Dialogflow用的是v3版本,响应结构可以参考官方的最新规范,但核心都是要返回包含
fulfillmentMessages或fulfillmentText的对象,不能直接返回字符串。 - 确保你的Webhook最终返回的是JSON格式,并且HTTP响应的
Content-Type头设置为application/json,不然Dialogflow也会解析失败。 - 如果请求OMDB API后需要处理返回的电影数据,你可以在
end事件里把raw转成JSON,然后根据数据生成更个性化的响应内容。
内容的提问来源于stack exchange,提问作者Alex R.
相关产品推荐
相关产品推荐

