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

Fit*_*itz 5 java rest spring-mvc google-assist-api actions-on-google

我正在使用Java为Google助手创建一个应用程序,该应用程序将调用外部REST API并根据触发短语返回某些响应。我目前可以使用默认的欢迎意图通过Google模拟器上的操作返回简单的文本回复。但是,当我尝试调用外部REST API并发送回响应时,模拟器返回一条消息,内容为:

“ MalformedResponse:由于语音响应为空,无法将Dialogflow响应解析为AppResponse。”

我正在使用org.springframework.web.client.RestTemplate来自Spring框架的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行动中)

我的测试应用程序的一个训练短语示例是“ Tony正在发送问候语”。从这里,我将“ Tony”提取为@sys.given-nameDialogflow中的一个实体。然后将该名称传递给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();
  }
Run Code Online (Sandbox Code Playgroud)

Fit*_*itz 0

看来,由于actions-on-google需要线程安全的函数调用,因此RestTemplatefromspring-framework在应用程序中不起作用app-engine。我能够使用团队actions-on-googleGitHub上提供的示例代码找到解决方案。此代码要求您从 URL 中解析结果,而ActionsApp不是使用库。例如:

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);

Run Code Online (Sandbox Code Playgroud)

在解析远程 URL 的结果时,我还遇到了一个严重的问题 (UnKonwnHostException)。该文档很有帮助。