如何处理对外部REST服务的请求并将响应返回给Google Assistant?

时间:2019-05-30 12:28:49

标签: java rest spring-mvc actions-on-google google-assist-api

我正在使用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();
  }

1 个答案:

答案 0 :(得分:0)

由于actions-on-google需要进行线程安全的函数调用,因此RestTemplate中的spring-frameworkapp-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很有帮助。