2016-06-10 8 views
6

Ich habe versucht, eine Hello World Geschicklichkeit auf https://github.com/amzn/alexa-skills-kit-java Basis zu schaffen, aber wenn ich die Lambda-Funktion getestet wurde, zeigte es diesen FehlerAlexa Geschicklichkeit Kit -Lambda Funktion - kann nicht bestätigen 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)" 
    ] 
    } 
} 

Dies ist meine Java-Datei

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); 
    } 
} 

Was vermisse ich ??

+0

Haben Sie die Lösung gefunden? Wenn ja, können Sie teilen? Ich habe das gleiche Problem. – RommelTJ

Antwort

8

Für mich habe ich diese Ausnahme, weil ich versucht habe, meine Lambda-Funktion ohne eine ordnungsgemäße Test-Ereignis JSON unter der Registerkarte Aktionen ausführen. Wenn Sie auf die Registerkarte "Aktionen" klicken und dann auf "Test-Ereignis konfigurieren" klicken, sollten Sie Ihre Funktion in JSON-Form eingeben, die sie interpretieren kann. Nach langem Hinsehen habe ich herausgefunden, dass du dieses JSON bekommen kannst, indem du zur Entwicklerkonsole gehst, wo du deine Fähigkeiten mit all deinen Fähigkeiten-Konfigurationen gemacht hast. Klicken Sie auf der linken Seite auf die Registerkarte "Test" und gehen Sie dann zum Abschnitt "Service Simulator". Es gibt ein Textfeld mit der Aufschrift "Enter Utterance", in dem Sie einen Sprachbefehl für Ihre Funktion in Text eingeben können, z. B. "Alexa sagen [yourApp] Hallo sagen". Klicken Sie auf die Schaltfläche "Ask [yourApp]" und eine Lambda-Anfrage JSON wird auf der linken Seite mit der Ausgabe auf der rechten Seite generiert. Dann kopiere einfach das JSON von links in dein Test-Event in deiner Lambda-Konsole und dann solltest du gut sein.

+0

Dank @Dan, ich habe zwei Probleme in meinem Code. 1. Setzen Sie Application ID in "[]", während es nicht so sein sollte. 2. Falsches JSON-Format im Testevent Endlich funktioniert es. – PKTomar

0

Ich würde den Code static auf die Klasse setzen, die Sie erstellt haben, die erweitert SpeechletLambda. Dies ist, glaube ich, wo die Auswertung stattfindet und gelöst wird, bevor diese Klasse geladen und ihr statischer Code ausgeführt wird.

Alternativ können Sie einfach die Validierung deaktivieren. Wenn jemand Ihre Entwicklungsumgebung gut genug kennt, um Ihre private Lambda-Funktion aufzurufen, wissen sie wahrscheinlich genug, um Ihre Anwendungs-ID zu fälschen. Es gibt also keinen großen Sicherheitswert für die Validierung. Ein Beispiel zum Ausschalten finden Sie unter here.

+0

Ich versuche, meine benutzerdefinierte Fähigkeit als AWS-Lambda-Funktion und ** nicht als Web-Service ** zu implementieren, so dass "Speechlet" statt "SpeechServlet" erweitert wird. Es hat also nicht funktioniert. Und ich möchte entwickeln, ohne die Validierung abzuschalten. Was muss gemacht werden, bitte: - –

+0

Mein Bad. Ich habe meine Antwort und den Link mit einem Beispiel für Lambda aktualisiert. Es ist ziemlich genau dasselbe. –

8

Sie haben die falsche ID in der unterstützten Anwendungs-ID. Diese ID muss die ID der Alexa Skills-Anwendung sein, die auf der Seite mit den Skill-Informationen zu finden ist. Es sollte wie folgt aussehen:

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

Ich weiß, dass die Demo hat, ist mit [Ort id hier] Aber Sie wirklich die ganze Sache ersetzen.

+0

Dank @mmaceachran – PKTomar

1

Ich habe versucht, eine Adresse Skill in https://github.com/amzn/alexa-skills-kit-java enthalten, aber ich habe die gleiche Art von Fehler.

Es stellt sich heraus, dass das Problem in DeviceAddressSpeechletRequestStreamHandler war und Instanz von Set<String> supportedApplicationIds in statischen {} Block erstellen.

Als ich new HashSet<>(); zum Deklarieren von Attributen der Klasse bewegte, begann es zu arbeiten.

Verwandte Themen