私は外部のREST APIを呼び出し、トリガーフレーズに基づいて、特定の応答を返しますGoogleのアシスタントのためのアプリケーションを作成するためにJavaを使用しています。私は現在、Googleのシミュレータ上のアクションを通じて、単純なテキスト応答を返すために意図デフォルトのウェルカムを使用することができます。私は外部のREST APIを呼び出し、応答を返送しようとすると、しかし、シミュレータは、というメッセージを返します。
「MalformedResponse:なぜなら、空の音声応答のAppResponseにDialogflow応答を解析できませんでした。」
私が使用してい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);
(これは、通常の春に適していますこのプロジェクトではなく、Googleの意図にアクション内)
私のテストのアプリのための一例のトレーニング・フレーズは「トニーが挨拶を送っている。」であります ここから私は「トニー」を抽出しています@sys.given-name
Dialogflow内のエンティティ。この名前は、その後の処理のためのREST seriviceに渡されます。RESTサービスは、Googleのアシスタントアプリから別のGoogleクラウドプロジェクトで実行されているMVCアプリです。
これはDialogflow fullfillmentウェブフックを使用してRESTサービスを利用するためには良いアプローチである場合は私に知らせてください。
以下は、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();
}
以降のようですactions-on-google
、スレッドセーフな関数呼び出しを必要とするRestTemplate
からspring-framework
では動作しませんapp-engine
アプリ。私はによって提供されているサンプルコード使用してウォークアラウンドを見つけることができたactions-on-google
のチームGitHubのを。このコードは、内から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);
私はまた、リモートURLからの結果を解析する深刻な問題(UnKonwnHostException)を有していました。このドキュメントは役に立ちました。