Набор навыков Alexa - функция лямбда - не удалось проверить SpeechletRequest (java)

Я попытался создать навык HelloWorld на основе https://github.com/amzn/alexa-skills-kit-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)"
    ]
  }
}

Это мой файл 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);
    }
}

Что мне не хватает?


person Balaji Venkatesan    schedule 10.06.2016    source источник
comment
Вы придумали решение? Если да, то не могли бы вы поделиться? У меня такая же проблема.   -  person RommelTJ    schedule 15.08.2016


Ответы (4)


Я получил это исключение, потому что пытался запустить лямбда-функцию без правильного тестового события JSON на вкладке «Действия». Если вы перейдете на вкладку «Действия», а затем нажмете «Настроить тестовое событие», предполагается, что вы вводите свою функцию в форме JSON, которую она может интерпретировать. После долгих поисков я понял, что вы можете получить этот JSON, перейдя в консоль разработчика, где вы создали свой навык, соответствующий всем вашим конфигурациям навыков. С левой стороны щелкните вкладку «Тест», а затем перейдите в раздел «Симулятор обслуживания». Существует текстовое поле с надписью «Enter Utterance», в котором вы можете ввести голосовую команду для своей функции в тексте, например, «Alexa скажет [yourApp] сказать Hello». Нажмите кнопку «Спросить [ваше приложение]», и в левом поле будет сгенерирован JSON-запрос Lambda, а результат - в правом. Затем просто скопируйте и вставьте этот JSON слева в тестовое событие в лямбда-консоли, и тогда все будет хорошо.

person Dan Sagawaga    schedule 03.01.2017
comment
Спасибо @Dan, у меня в коде две проблемы. 1. Поместите Application Id в [], пока этого не должно быть. 2. неправильный формат json в тестовом событии. Наконец-то его работа. - person ParikshitSinghTomar; 12.12.2017

У вас неправильный идентификатор в поддерживаемом идентификаторе приложения. Этот идентификатор должен быть идентификатором приложения Alexa Skills, которое можно найти на странице информации о навыках. Это должно выглядеть примерно так:

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

Я знаю, что демо имеет [идентификатор места здесь], но вы действительно заменяете все это.

person mmaceachran    schedule 25.10.2016
comment
Спасибо @mmaceachran - person ParikshitSinghTomar; 12.12.2017
comment
обратите внимание, что строка по умолчанию из примера приложения GIT - это // supportedApplicationIds.add ([здесь-уникального-значения]); (закомментировал). Вам также необходимо удалить []. - person RNJ; 14.01.2019

Я попытался создать навык адресации, включенный в https://github.com/amzn/alexa-skills-kit-java, но у меня возникла такая же ошибка.

Оказывается, проблема была в DeviceAddressSpeechletRequestStreamHandler и создании экземпляра Set<String> supportedApplicationIds в статическом блоке {}.

Когда я перешел new HashSet<>(); к объявлению атрибутов класса, он заработал.

person Dušan Salay    schedule 03.08.2017

Я бы поместил код static в созданный вами класс, расширяющий SpeechletLambda. Я считаю, что это то место, где происходит оценка и разрешается до того, как этот класс будет загружен и его статический код будет выполнен.

В качестве альтернативы вы можете просто отключить проверку. Если кто-то знает вашу среду разработки достаточно хорошо, чтобы вызвать вашу частную лямбда-функцию, он, вероятно, знает достаточно, чтобы подделать ваш идентификатор приложения. Таким образом, его проверка не имеет большого значения для безопасности. Пример его отключения см. здесь < / а>.

person Joseph Jaquinta    schedule 10.06.2016
comment
Я пытаюсь применить свои собственные навыки как лямбда-функцию AWS, а ** не как веб-службу **, поэтому расширяю Speechlet, а не SpeechServlet. Так что это не сработало. И я хочу развиваться, не отключая валидацию. Что нужно сделать, пожалуйста: - - person Balaji Venkatesan; 10.06.2016
comment
Виноват. Я обновил свой ответ и ссылку с примером для Lambda. Это почти то же самое. - person Joseph Jaquinta; 10.06.2016