028-86261949

当前位置:首页 > 学科资讯 > 如何使用Spring Boot的Alexa技巧?

如何使用Spring Boot的Alexa技巧?

2020/04/10 16:17 分类: 学科资讯 浏览:0

您可以通过扩展一个servlet来构建Alexa的自定义技能,该servlet接受来自云中Alexa服务的请求并向其发送响应。

本项目将介绍如何使用SpringBoot和HTTPservlet映射示例构建Alexa技能。

可以通过以下方法实现servlet映射ServletRegistrationBean在SpringBoot中,以及使用Spring注释。在本例中,我们将使用ServletRegistrationBean类将Alexaservlet注册为Springbean。

 

先决条件

这里有在这个项目中使用的技术。

  1. Java 1.8
  2. Alexa技能工具包2.29.0
  3. Spring Boot 2.5.0.RELEASE
  4. Maven 3.6.1
  5. IntelliJ IDEA
  6. 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班级:

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并创建安全隧道:

ngrok

所以现在你得去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为您提供了以不同方式创建技能的可能性。我希望这个例子项目对你有帮助。

 

#标签:Spring Boot,Alexa技巧