Alexa 技能工具包 -Lambda 函数 - 无法验证 SpeechletRequest (java)
Posted
技术标签:
【中文标题】Alexa 技能工具包 -Lambda 函数 - 无法验证 SpeechletRequest (java)【英文标题】:Alexa Skill kit -Lambda function - Could not validate SpeechletRequest (java) 【发布时间】:2016-10-11 02:03:53 【问题描述】:我尝试基于 https://github.com/amzn/alexa-skills-kit-java 创建一个 HelloWorld 技能,但是当我测试 lambda 函数时,它显示了这个错误
"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);
我错过了什么??
【问题讨论】:
您找到解决方案了吗?如果有,可以分享一下吗?我有同样的问题。 【参考方案1】:您在受支持的应用程序 ID 中输入了错误的 ID。该 ID 需要是 Alexa Skills 应用程序的 ID,可在技能信息页面上找到。它应该看起来像这样:
supportedApplicationIds.add("amzn1.ask.skill.c236d019-7d2a-5c96-a02f-ef8ab6f8e023");
我知道演示是 [place id here] 但你真的替换了整个东西。
【讨论】:
谢谢@mmaceachran 请注意,示例 GIT 应用程序的默认行是 //supportedApplicationIds.add("[unique-value-here]"); (注释掉)。您还需要删除 [ ]。【参考方案2】:对我来说,我遇到了这个异常,因为我试图在“操作”选项卡下没有正确的测试事件 JSON 的情况下运行我的 lambda 函数。如果单击“操作”选项卡,然后单击“配置测试事件”,则应该以它可以解释的 JSON 形式提供函数输入。经过大量查看后,我发现您可以通过转到开发人员控制台来获取此 JSON,您可以在其中创建包含所有技能配置的技能。在左侧单击“测试”选项卡,然后转到“服务模拟器”部分。有一个显示“输入话语”的文本框,您可以在其中以文本形式向您的功能输入语音命令,例如“Alexa 告诉 [yourApp] 打招呼”。单击“询问 [yourApp]”按钮,左侧框中将生成一个 Lambda 请求 JSON,右侧为输出。然后只需将左侧的 JSON 复制并粘贴到 lambda 控制台中的测试事件中,就可以了。
【讨论】:
谢谢@Dan,我的代码有两个问题。 1.将Application Id放在“[]”中,而它不应该是这样的。 2.测试事件中的json格式错误。最后它的工作。【参考方案3】:我尝试创建包含在https://github.com/amzn/alexa-skills-kit-java 中的地址技能,但我遇到了相同类型的错误。
原来问题出在DeviceAddressSpeechletRequestStreamHandler
并在静态 块中创建Set<String> supportedApplicationIds
的实例。
当我将 new HashSet<>();
移动到声明类的属性时,它开始工作了。
【讨论】:
【参考方案4】:我会将static
代码放到您创建的扩展SpeechletLambda
的类中。我相信,这是在加载此类并执行其静态代码之前进行评估并得到解决的地方。
或者,您也可以关闭验证。如果有人非常了解您的开发环境以调用您的私有 lambda 函数,那么他们可能知道足以欺骗您的应用程序 ID。所以验证它没有太多的安全价值。有关关闭它的示例,请参阅here。
【讨论】:
我正在尝试将我的自定义技能部署为 AWS lambda 函数,并且**不是作为 Web 服务**所以扩展 'Speechlet' 而不是 'SpeechServlet' 。所以它没有用。我想在不关闭验证的情况下进行开发。需要做什么建议请:- 我的错。我已经用 Lambda 的示例更新了我的答案和链接。这几乎是一回事。以上是关于Alexa 技能工具包 -Lambda 函数 - 无法验证 SpeechletRequest (java)的主要内容,如果未能解决你的问题,请参考以下文章