【问题标题】:How to process a request to an external REST service and return the response to Google Assistant?如何处理对外部 REST 服务的请求并将响应返回给 Google Assistant?
【发布时间】:2019-10-16 02:46:02
【问题描述】:

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

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

我正在使用 Spring-framework 中的 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 项目中效果很好,但在 Actions on Google Intent 中效果不佳)

我的测试应用的一个示例训练短语是“托尼正在发送问候”。从这里我将“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();
  }

【问题讨论】:

  • 这看起来与您的 REST API 查询无关。这可能是因为givenName 为空。例外情况是您的语音响应为空。只有当您的if 语句未被触发时才会发生这种情况(因为givenName 为空或为空)。仔细检查您的参数givenName 是否有值
  • 谢谢,但事实并非如此。即使我硬编码givenName 并删除if 语句,我仍然会收到相同的错误消息。另一件事是,如果问候语曾经在意图中返回响应,我不知道如何调试。我似乎无法找到 LOGGER 在模拟器中的登录位置。我拥有的唯一日志是代理和助手之间消息的模拟器日志。
  • greeting 有内容吗?似乎greeting 既可以是非空的,也可以是空的内容
  • greeting 变量中获取值是发布此问题的主要原因。这就是进行 REST 调用的地方,但没有实现。此行适用于简单的 Java 项目,但不适用于 Actions on Google 应用。

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


【解决方案1】:

似乎由于actions-on-google 需要线程安全的函数调用,来自spring-frameworkRestTemplateapp-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);

我在解析远程 URL 的结果时也遇到了严重问题 (UnKonwnHostException)。这个documentation 很有帮助。

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多