Java i Google Actions dla Asystenta Google

0

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:

  1. 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/

  2. 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!

0

Nikt nie potrafi pomóc?

1 użytkowników online, w tym zalogowanych: 0, gości: 1