我正在使用Java为Google助手创建一个应用程序,该应用程序将调用外部REST API并根据触发短语返回某些响应。 我目前可以使用默认的欢迎意图通过Google模拟器上的操作返回简单的文本回复。但是,当我尝试调用外部REST API并发送回响应时,模拟器返回一条消息,内容为:
“ MalformedResponse:由于语音响应为空,无法将Dialogflow响应解析为AppResponse。”
我正在使用Spring框架中的org.springframework.web.client.RestTemplate
通过以下调用来处理REST服务(https://fitzroi-rest-api-0525.appspot.com/rest/Fitz)的结果:
greeting = restTemplate.getForObject("https://fitzroi-rest-api-0525.appspot.com/rest/{name}", Greeting.class, givenName);
(在常规的Spring项目中效果很好,但在Google Intent的Actions中效果不佳)
我的测试应用的训练短语示例为“ Tony正在发送问候语”。从这里,我将“ Tony”提取为Dialogflow中的@sys.given-name
实体。然后将该名称传递给REST服务进行处理。 REST服务是一个MVC应用程序,它在与Google Assistant应用程序不同的Google Cloud项目中运行。
请告诉我这是否是使用Dialogflow fullfillment webhook消费REST服务的好方法。
下面是我的Webhook中的一个示例代码,试图使用REST服务。
@ForIntent("process-greeting")
public ActionResponse greetingProcessor(ActionRequest request) {
LOGGER.info("Trying to process greeting intent");
ResponseBuilder responseBuilder = getResponseBuilder(request);
String givenName = (String) request.getParameter("given-name");
if (givenName != null && !givenName.isEmpty()) {
RestTemplate restTemplate = new RestTemplate();
Greeting greeting = null;
greeting = restTemplate.getForObject("https://fitzroi-rest-api-0525.appspot.com/rest/{name}", Greeting.class, givenName);
// LOGGER.info("Attempting to send back " + greeting.getContent() + " to Google Assistant");
if (greeting == null)
responseBuilder.add("The rest service did not return a response.");
else
responseBuilder.add(greeting.getContent());
}
LOGGER.info("Welcome intent end.");
return responseBuilder.build();
}
答案 0 :(得分:0)
由于actions-on-google
需要进行线程安全的函数调用,因此RestTemplate
中的spring-framework
在app-engine
应用中不起作用。通过使用actions-on-google
团队在GitHub上提供的示例代码,我可以找到一种解决方法。此代码要求您从ActionsApp
内部解析URL的结果,而不要使用库。例如:
URL restURL = new URL("http://yourdomain.com/your/rest/call");
URLConnection conn = restURL.openConnection();
InputStreamReader reader = new InputStreamReader(
(InputStream) conn.getContent());
JsonParser parser = new JsonParser();
JsonElement root = parser.parse(reader);
MyObject = myParseFunction(root);
我也遇到了一个严重的问题(UnKonwnHostException),它无法解析来自远程URL的结果。 documentation很有帮助。