2016-06-10 22 views
6

Próbowałem stworzyć HelloWorld umiejętności oparte na https://github.com/amzn/alexa-skills-kit-java ale gdy testowałem funkcji lambda pokazał ten błądAlexa zestaw umiejętności funkcja -Lambda - Nie można zweryfikować SpeechletRequest (Java)

{ 
    "errorMessage":"com.amazon.speech.speechlet.SpeechletRequestHandlerException: Could not validate SpeechletRequest null using verifier ApplicationIdSpeechletRequestVerifier, rejecting request", 

    "errorType": "java.lang.RuntimeException", 

    "stackTrace": [ "com.amazon.speech.speechlet.lambda.SpeechletRequestStreamHandler.handleRequest(SpeechletRequestStreamHandler.java:101)", 
"helloworld.HelloWorldSpeechletRequestStreamHandler.handleRequest(HelloWorldSpeechletRequestStreamHandler.java:43)" 

], 

    "cause": { 

    "errorMessage": "Could not validate SpeechletRequest null using 
verifier ApplicationIdSpeechletRequestVerifier, rejecting request", 
    "errorType": "com.amazon.speech.speechlet.SpeechletRequestHandlerException", 

    "stackTrace": [ 
     "com.amazon.speech.speechlet.SpeechletRequestHandler.handleSpeechletCall(SpeechletRequestHandler.java:73)", 
     "com.amazon.speech.speechlet.lambda.SpeechletRequestStreamHandler.handleRequest(SpeechletRequestStreamHandler.java:98)", 
     "helloworld.HelloWorldSpeechletRequestStreamHandler.handleRequest(HelloWorldSpeechletRequestStreamHandler.java:43)" 
    ] 
    } 
} 

To jest mój plik Java

public final class HelloWorldSpeechletRequestStreamHandler extends SpeechletRequestStreamHandler { 
    private static final Set<String> supportedApplicationIds = new HashSet<String>(); 
    static { 
     /* 
     * This Id can be found on https://developer.amazon.com/edw/home.html#/ "Edit" the relevant 
     * Alexa Skill and put the relevant Application Ids in this Set. 
     */ 
     supportedApplicationIds.add("amzn1.echo-sdk-ams.app.[amzn1.echo-sdk-ams.app.56bcdaf9-97fc-47f9-9918-43cb6a90d9f5]"); 
    } 


    public HelloWorldSpeechletRequestStreamHandler() { 
     super(new HelloWorldSpeechlet(), supportedApplicationIds); 
    } 
} 

Czego mi brakuje?

+0

Czy wymyśliłeś rozwiązanie? Jeśli tak, czy możesz podzielić się nimi? Mam ten sam problem. – RommelTJ

Odpowiedz

8

Dla mnie mam ten wyjątek, ponieważ próbowałem uruchomić moją funkcję lambda bez odpowiedniego zdarzenia testowego JSON w zakładce Akcje. Jeśli klikniesz kartę "Akcje", a następnie klikniesz "Konfiguruj zdarzenie testowe", powinieneś podać swoją funkcję w formularzu JSON, który może zinterpretować. Po długich poszukiwaniach zorientowałem się, że możesz uzyskać ten JSON, przechodząc do konsoli programisty, w której wykonałeś swoje umiejętności, które mają wszystkie konfiguracje umiejętności. Po lewej stronie kliknij zakładkę "Test", a następnie przejdź do sekcji "Symulator usługi". Jest pole tekstowe z napisem "Enter Utterance", w którym można wprowadzić polecenie głosowe do funkcji w tekście, np. "Alexa tell [yourApp], aby powiedzieć" cześć ". Kliknij przycisk "Ask [yourApp]", a na ekranie po lewej stronie wyświetli się JSON Lambda, z wyjściem po prawej. Następnie po prostu skopiuj i wklej ten JSON po lewej stronie w zdarzenie testowe w konsoli lambda, a potem powinieneś być dobry.

+0

Dzięki @Dan, mam dwa problemy w moim kodzie. 1. Wpisz ID aplikacji w "[]", podczas gdy nie powinno tak być. 2. nieprawidłowy format json w zdarzeniu testowym. Wreszcie działa. – PKTomar

0

Umieszczę kod static na utworzonej klasie, która rozszerza się o SpeechletLambda. To jest, jak sądzę, miejsce, w którym odbywa się ewaluacja i zostaje rozwiązana przed załadowaniem tej klasy i wykonaniem jej kodu statycznego.

Alternatywnie można wyłączyć sprawdzanie poprawności. Jeśli ktoś zna twoje środowisko programistyczne na tyle, by zadzwonić do twojej prywatnej funkcji lambda, prawdopodobnie wie wystarczająco dużo, aby podrobić swój identyfikator aplikacji. Tak więc nie ma dużej wartości bezpieczeństwa, aby to sprawdzić. Aby zobaczyć przykład wyłączenia go, zobacz here.

+0

Próbuję wdrożyć moje niestandardowe umiejętności jako funkcja lambda AWS i ** nie jako usługa sieci Web **, więc rozszerzenie "Speechlet" zamiast "SpeechServlet". Więc to nie zadziałało. I chcę się rozwijać bez sprawdzania poprawności. Co należy zrobić, proszę o sugestie: - –

+0

My bad. Zaktualizowałem swoją odpowiedź i link do przykładu dla Lambdy. To prawie to samo. –

8

Masz nieprawidłowy identyfikator w obsługiwanym ID aplikacji. Ten identyfikator musi być identyfikatorem aplikacji Alexa Skills, którą można znaleźć na stronie Informacje o umiejętnościach. Powinno to wyglądać mniej więcej tak:

supportedApplicationIds.add("amzn1.ask.skill.c236d019-7d2a-5c96-a02f-ef8ab6f8e023"); 

Wiem, że wersja demonstracyjna ma miejsce z [miejsce w tym miejscu] Ale naprawdę to wszystko zastępujesz.

+0

Dzięki @ mmaceachran – PKTomar

1

Próbowałem utworzyć umiejętność adresowania zawartą w https://github.com/amzn/alexa-skills-kit-java, ale dostałem ten sam typ błędu.

Okazuje się, że problem był w DeviceAddressSpeechletRequestStreamHandler i tworzenie instancji Set<String> supportedApplicationIds w statycznym bloku {}.

Kiedy przeniosłem new HashSet<>(); do deklarowania atrybutów klasy, zaczęło działać.