Witam
Od jakiegoś czasu bawie się pisaniem scenariuszy dla systenta google. Na początek chciałem zapalać diodę LED poprzez polecenie głosowe. Mój asystent ma problem z nawiązaniem połączenia z serwerem uruchomionym na tomcacie. Oczywiście inne aplikacje działają, także mam pewność, że przynajmniej konfiguracja tomcata jest poprawna.
Może zacznę od początku:
-
Utworzyłem przykładową aplikację https://console.actions.google.com/
zawierającą jedną intencję o nazwie "intencja". W zakładce DialogFlow w zakładce fulfilment dodałem adres serwera tomcat
http://ip4.me/ctions/intencja
W tomcacie skonfigurowąłem połączenie https. W routerze mam ustawiony NAT/PAT i mam świadomość ze ip routera się zmienia co jakiś czas dlatego
pilnuje tego poprzez stronę http://ip4.me/ -
Buduje drzewo folderów aplikacji webapps -> actions -> WEB-INF -> classes -> skompilowane pliki
Poniżej prosty projekt z użyciem biblioteki asystenta google dla Java:
Poniżej serwlet:
@WebServlet(name = "SimpleServlet", urlPatterns = {"/intencja"}, loadOnStartup = 1)
public class SimpleServlet extends HttpServlet {
private App app = new SimpleApp();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws IOException {
System.out.println("doPOST googleActions");
System.out.println("googleActions doPost:" + new Date());
String requestBody = req.getReader().lines().collect(Collectors.joining());
Map<String, String> headersMap =
Collections.list(req.getHeaderNames())
.stream()
.collect(Collectors.toMap(name -> name,req::getHeader));
try {
String responseBody = app.handleRequest(requestBody, headersMap).get();
//resp.setContentType("application/json; charset=utf-8");
resp.setContentType("application/json");
resp.getWriter().write(responseBody);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
resp.getWriter().write(e.getMessage());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("doGET googleActions");
response.setContentType("text/plain");
response.getWriter().println(
"ActionsServlet is listening but requires valid POST request to respond with Action response.");
}
oraz aplikacja asystenta google ktora po wywolaniu intencji "intencja" powinna zwrocic Hello, Google AppEngine! w postaci słów wypowiadanych przez asystenta. Niestety tak się nie dzieje, a asystent ciągle mówi że aplikacja nie odpowiada po próbie wywołania tej intencji.
public class SimpleApp extends DialogflowApp {
@ForIntent("intencja")
public ActionResponse welcome(ActionRequest request) {
ResponseBuilder builder = getResponseBuilder(request);
builder.add("Hello, Google AppEngine!");
return builder.build();
}
}
W oknie konsoli tomcata nie ma żadnych exceptionów, ale komunikaty w stylu : System.out.println("doPOST googleActions"); również się nie pojawiają. Natomiast jeśli wpiszę adres serwera w przeglądarkę to wywołuje się metoda doGet z napisem "ActionsServlet is listening but requires valid POST request to respond with Action response.".
Ktoś może rozwiązał już podobny problem? Pomocy!