使用Spring Boot构建Restful Web Service应用

2019-10-20 · 树下魅狐 · · 本文共2,155个字,预计阅读需要10分钟。

在本篇文章中,将介绍如何使用Spring Boot构建一个简单的Restful Web Service应用程序。项目使用Maven进行构建,并使用IDEA作为默认的编辑器。

Spring Boot 2.2.2.RELEASE需要Java 8或更高的版本,Spring Framework需要 5.2.2.RELEASE或更高版本;Maven需要3.2或以上的版本。在开始项目之前,请先检查本地的环境是否满足以上要求。

1. 检查JDK版本

​ 打开本地终端,在终端界面输入java -version检出JDK的版本信息,你可以通过下面的gif短片了解命令的使用:

2. 检查Maven版本

​ 在终端中输入mvn -v命令检出Maven的版本信息,你可以通过下面的gif短片了解命令的使用:

接下来,让我们先了解一些本示例的项目将要达到的功能。

3. 项目预期的功能

我们将构建一个基于Http GET请求的web service应用程序,当在浏览器中访问如下地址时:

http://localhost:8080/users

将以JSON的格式返回所有的用户信息,例如:

{
    "id": 1,
    "username": "King",
    "content": "My name is King"
}

另外,还可以在请求地址中添加一个可选的查询字符串参数name,例如:

http://localhost:8080/users?name=Ramostear

当访问上述地址时,应用将创建一个名称为Ramostear的JSON对象,例如:

{
    "id": 5,
    "username": "Ramostear",
    "content": "My name is Ramostear"
}

接下来,我们将开始创建并编写相关的代码。

4. 工具的依赖库

构建本示例的项目,我们需要以下的工具和依赖库:

  • Spring Boot.2.2.2.RELEASE
  • JDK 1.8 +
  • Spring Framework 5.2.2.RELEASE
  • Maven 3.2 +
  • Lombok plugin
  • IntelliJ IDEA
  • Postman

4.1 Lombok插件

​ Lombok是一个基于Java开发插件,它使得Java开发者可以通过其定义的一些注解来消除项目中冗长和繁琐的模板代码,可以提高代码的编写效率。例如,使用Lombok的注解,你不必在书写Getter,Setter,Constructor,toString等方法,如果你需要使用Lombok插件,首先得再IDEA中安装Lombok插件,下面的gif短片演示了如何在IDEA中安装Lombok:

4.2 Postman

Postman是一个功能强大的API调试,Http请求,自动化测试工具,在本次案例中,我们将使用Postman测试Restful Web Service应用程序。你可以访问下面的地址了解并下载Postman:

https://www.getpostman.com/

5. 创建Spring Boot项目

​ 有很多种方法可以创建Spring Boot应用程序。在本次示例(以及后续的系列文章)中,默认使用IDEA创建Spring Boot项目。如果你对IDEA创建Spring Boot项目不太熟悉,可以查看第三章 使用IntelliJ IDEA创建Spring Boot项目 了解更多详细细节。

​ 与往常一样,我们需要为项目指定一些必要的信息:

  • Group:com.ramostear
  • Artifact:restful-web-service
  • Type:项目的构建方式,默认为Maven 工程
  • Language:项目的编辑语言,默认为Java
  • Packaging:项目最终的打包方式,默认为Jar
  • Java Version:Java的版本,默认为1.8
  • Version:项目的版本号,默认为0.0.1-SNAPSHOT(快照版)
  • Name:项目的名称,例如restful-web-service
  • Description:项目的描述信息,Restful web service application base on Spring Boot 2.2.2
  • Package:项目的root包名,例如com.ramostear.restful

除此之外,我们还需要向工程中添加Spring Web 和Lombok两个依赖库。

6. 工程结构

以下是本次示例的项目工程结构:

7. pom.xml

下面是pom.xml文件的完整内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ramostear</groupId>
    <artifactId>restful-web-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>restful-web-service</name>
    <description>Restful web service application base on Spring Boot 2.2.2</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

现在,整个项目已经构建完成,接下来我们将编写相关的业务代码。

8. 创建User POJO类

​ 在本示例中,我们将使用User对象来封装内部的一些细节,包括用户ID,用户名和内容信息。为了减少编码时间,提高开发效率,在User类中,我们使用Lombok注解替代传统的Getter/Setter,构造器以及toString方法的书写。下面是User类的完整内容:

package com.ramostear.restful;

import lombok.*;

/**
 * @ClassName User
 * @Description TODO
 * @Author ramostear
 * @Date 2020/1/8 0008 6:00
 * @Version 1.0
 **/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String username;
    private String content;
}

注:@Data注解等同于@Getter@Setter的组合,在项目进入编译期时,Lombok会自动为User类生成相应的Getter/Setter,toString,无参构造函数和全部参数的构造函数。这里不对Lombok注解做过多的介绍。

接下来,我们将创建一个资源控制器来处理外部请求。

9. 创建资源控制器

​ 在示例中,定义了一个UserController类来处理外部的请求,并使用@RestController注解标注改类为一个资源控制处理类。下面时UserController的完整代码:

package com.ramostear.restful;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @ClassName UserController
 * @Description TODO
 * @Author ramostear
 * @Date 2020/1/8 0008 6:03
 * @Version 1.0
 **/
@RestController
public class UserController {

    public static Map<String,User> userData = new HashMap<>();
    private static final String CONTENT_TEMPLATE = "My name is %s";
    private static final AtomicLong ID_COUNTER = new AtomicLong();

    @GetMapping("/users")
    public User users(@RequestParam(value = "name",defaultValue = "King")String name){
        userData.putIfAbsent(name,new User(ID_COUNTER.incrementAndGet(),name,String.format(CONTENT_TEMPLATE,name)));
        return userData.get(name);
    }
}

下面对该类做一些简单介绍:

  • userData充当一个临时的存储器,用于存放用户数据;
  • @GetMapping注解用于将/users请求映射到users()方法中;
  • @GetMapping注解是@RequestMapping(method=GET)的快捷写法;
  • @RequestParam注解用于将查询字符串参数名称的值于users()方法中的参数进行绑定,如果请求中不存在name查询参数,则使用默认的”King“作为其值;
  • 如果名称在userData中存在,则直接返回数据,如果名称在userData中不存在,则先创建,然后返回数据;

Restful Web Service的控制器与传统的Spring MVC控制器的区别在于两者所创建的Http响应主体的方式。Restful Web Service的控制器无需返回一个视图名称,而是将数据作为响应主体返回给请求端。此外,@RestController是一个组合注解(快捷注解),@Controller@ResponseBody注解的组合使用也能达到@RestController的效果。

10. 运行应用程序并测试

接下来,我们将使用下面的命令启动应用程序:

mvn spring-boot:run

你也可以直接运行RestfulWebServiceApplication类中的main()方法类启动应用程序。当项目启动成功狗,你可以在浏览器中输入http://localhost:8080/usershttp://localhost:8080/users?name=Ramostear 或其他name参数进行测试,本例中,我们将使用Postman对应用程序进行测试,下面是测试的一段gif动画:

在本篇文章中,介绍了如何使用Spring Boot 创建一个Restful web service应用,在下一各章节中,将着重介绍Spring Boot中的核心注解。