如何使用Spring Boot的Alexa技巧?
2020/04/10 16:17 分类: 学科资讯 浏览:0
您可以通过扩展一个servlet来构建Alexa的自定义技能,该servlet接受来自云中Alexa服务的请求并向其发送响应。
本项目将介绍如何使用SpringBoot和HTTPservlet映射示例构建Alexa技能。
可以通过以下方法实现servlet映射ServletRegistrationBean
在SpringBoot中,以及使用Spring注释。在本例中,我们将使用ServletRegistrationBean
类将Alexaservlet注册为Springbean。
先决条件
这里有在这个项目中使用的技术。
- Java 1.8
- Alexa技能工具包2.29.0
- Spring Boot 2.5.0.RELEASE
- Maven 3.6.1
- IntelliJ IDEA
- ngrok
项目结构
该项目的结构如下:
├────src
2
│ └───main
3
│ ├───java
4
│ │ └───com
5
│ │ └───xavidop
6
│ │ └───alexa
7
│ │ ├───configuration
8
│ │ ├───handlers
9
│ │ ├───properties
10
│ │ └───servlet
11
│ │
12
│ └───resources
13
│ application.properties
14
│ log4j2.xml
15
└── pom.xml
这些是该项目的主要文件夹和文件:
- 配置*该文件夹具有
WebConfig
类,它将注册AlexaHTTPservlet。 - 操作者所有的alexa处理程序。他们将处理所有的Alexa请求。
- 特性在这里你可以找到
PropertiesUtils
类读取Springapplication.propeties
档案。 - Servlet*邮寄请求的入境点在此。这是
AlexaServlet
. - 资源:Alexa、Spring和Log4j2配置。
- Pom.xml*该项目的依赖性。
Maven属地
这些是本例中使用的依赖项。你可以在pom.xml
档案:
Spring Boot:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
Alexa技能工具包:
<dependency>
<groupId>com.amazon.alexa</groupId>
<artifactId>ask-sdk</artifactId>
<version>2.29.0</version>
</dependency>
Log4j2:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.1</version>
</dependency>
SpringBootMaven构建插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Alexa HTTP servlet
由于AlexaHTTPservlet支持,您可以在官方GitHub储存库及其SkillServlet
类,我们可以使用SpringBoot注册它ServletRegistrationBean
如下所示。
这个SkillServlet
类从SkilBuilder对象注册技能实例,并提供doPost方法,该方法负责对传入请求进行反序列化,在调用技能之前验证输入请求,以及序列化生成的响应。
我们的AlexaServlet
类,位于servlet
文件夹扩展SkillServlet
注册为servlet之后,它将成为我们的主要入口点。
这个类是这样的:
public class AlexaServlet extends SkillServlet {
public AlexaServlet() {
super(getSkill());
}
private static Skill getSkill() {
return Skills.standard()
.addRequestHandlers(
new CancelandStopIntentHandler(),
new HelloWorldIntentHandler(),
new HelpIntentHandler(),
new LaunchRequestHandler(),
new SessionEndedRequestHandler())
// Add your skill id below
//.withSkillId("")
.build();
}
}
它将接收alexa的所有帖子请求,并将它们发送给位于handlers
文件夹,可以管理这些请求。
使用ServletRegistrationBean将AlexaHTTPservlet注册为Springbean
我们需要在Spring配置类中创建该类的bean。最相关的方法ServletRegistrationBean
我们在此项目中使用的类是:
setServlet
::设置要注册的servlet。在我们的情况下,AlexaServlet
.addUrlMappings
:为servlet添加URL映射。我们用/alexa
.setLoadOnStartup
::在启动时设置加载servlet的优先级。它不像上面这两种方法那么重要,因为在本例中我们只有一个HTTPservlet。
这个WebConfig
类是我们注册AlexaHTTPservlet的地方。以下是我们注册servlet的方式:
@Bean
public ServletRegistrationBean<HttpServlet> alexaServlet() {
loadProperties();
ServletRegistrationBean<HttpServlet> servRegBean = new ServletRegistrationBean<>();
servRegBean.setServlet(new AlexaServlet());
servRegBean.addUrlMappings("/alexa/*");
servRegBean.setLoadOnStartup(1);
return servRegBean;
}
设置属性
servlet必须满足某些要求,以处理Alexa发送的请求,并遵守Alexa技能工具包接口标准。有关更多信息,请参见将自定义技能作为Web服务托管在Alexa技能工具包技术文档.
在本例中,您可以设置四个属性。application.properties
档案:
- Server.port使用SpringBoot应用程序的端口。
- Com.amazon.ask.servlet.disableRequestSignatureCheck*禁用/启用安全性。
- Com.amazon.speech.speechlet.servlet.timestampTolerance请求的时间戳与当前本地执行时间之间的最大差距。以毫秒为单位。
- Javax.net.ssl.keyStore*如果第一个属性设置为
false
然后,您必须指定Keystore文件的路径。 - Javax.net.ssl.keyStorePassword*如果第一个属性设置为
false
然后您必须指定Keystore的密码。
使用SpringBoot建立技能
由于它是一个maven项目,您可以构建运行以下命令的SpringBoot应用程序:
mvn clean package
使用SpringBoot运行技能
以Java应用程序的形式运行AlexaSkilAppStadi.java类,即以→Java应用程序的身份运行→
或者,你可以使用:
mvn spring-boot:run
执行主类后,可以将alexa POST请求发送到http://localhost:8080/alexa.
用SpringBoot调试技巧
要将Springboot应用程序调试为JAVA应用程序,即转到Debug→Debug作为→JavaApplication。
或者,如果您使用IntellijIDEA,您可以在AlexaSkillAppStarter
班级:
在调试模式下执行主类之后,可以将alexa POST请求发送到http://localhost:8080/alexa并调试技能。
本地测试请求
我肯定你已经知道那个著名的工具电话了Postman。RESTAPI已经成为为您的服务提供公共和安全接口的新标准。虽然REST已经变得无处不在,但它并不总是容易测试的。Postman使测试和管理HTTPRESTAPI更加容易。Postman为我们提供了导入、测试和共享API的多种特性,这将帮助您和您的团队从长远来看更有效率。
运行应用程序后,将在http://localhost:8080/alexa。有了邮差,你可以模仿任何阿列克谢的请求。
例如,您可以测试LaunchRequest
{
"version": "1.0",
"session": {
"new": true,
"sessionId": "amzn1.echo-api.session.[unique-value-here]",
"application": {
"applicationId": "amzn1.ask.skill.[unique-value-here]"
},
"user": {
"userId": "amzn1.ask.account.[unique-value-here]"
},
"attributes": {}
},
"context": {
"AudioPlayer": {
"playerActivity": "IDLE"
},
"System": {
"application": {
"applicationId": "amzn1.ask.skill.[unique-value-here]"
},
"user": {
"userId": "amzn1.ask.account.[unique-value-here]"
},
"device": {
"supportedInterfaces": {
"AudioPlayer": {}
}
}
}
},
"request": {
"type": "LaunchRequest",
"requestId": "amzn1.echo-api.request.[unique-value-here]",
"timestamp": "2020-03-22T17:24:44Z",
"locale": "en-US"
请注意使用属性完成请求的时间戳字段。com.amazon.speech.speechlet.servlet.timestampTolerance
.
直接来自Alexa的测试请求
ngrok是一个非常酷的轻量级工具,它在本地机器上创建一个安全隧道,以及一个可用于浏览本地站点或API的公共URL。
当ngrok运行时,它侦听本地web服务器正在运行的同一个端口,并代理对本地计算机的外部请求
从那里,这是一个简单的步骤,让它听你的Web服务器。假设您正在8080端口上运行本地Web服务器。在终点站,你可以输入:ngrok http 8080
。这将启动ngrok侦听端口8080并创建安全隧道:
所以现在你得去Alexa开发者控制台,转到您的技能>端点>https,添加上面生成的https URL,后面是/Alexa。例:https://fe8ee91c.ngrok.io/alexa.
选择MyDevelopment终结点是子域.选项,然后单击页面顶部的保存端点。
转到AlexaDeveloper控制台中的Test选项卡并启动您的技能。
Alexa Developer控制台将向ngrok端点发送一个HTTPS请求(https://fe8ee91c.ngrok.io/alexa),它将将其路由到在SpringBoot服务器上运行的技能。
结语
对于所有不想在云中托管代码或不想使用AWSLambda函数的开发人员来说,这个示例非常有用。这不是一个问题,因为,正如您在本例中所看到的,Alexa为您提供了以不同方式创建技能的可能性。我希望这个例子项目对你有帮助。
赞 0