前面我们我们已经看了Spring Boot中的很多知识点了,也见识到Spring Boot带给我们的各种便利了,今天我们来看看针对在Spring Boot中输出REST资源这一需求,Spring Boot带给我们哪些惊喜呢?最近这些文章是成一个系列的,如果小伙伴还没看前面几篇博客,读懂本文可能会有一些压力,建议对Spring Boot尚不了解的小伙伴先移步这里从SpringMVC到Spring Boot,已经很了解的小伙伴请忽略。OK,那么废话不多说,开始今天愉快的旅程吧。


关于什么是REST资源,很多小伙伴可能会有一种错觉,觉得地址栏写的干净整洁满足条件的就是RESTful架构,其实不然,关于什么是RESTful架构,给小伙伴们推荐这篇文章看一下理解RESTful架构,这篇博客带小伙伴们入个门是没问题的,如果还想了解更多关于REST的资料,自行Google吧。


创建工程并添加数据库依赖

当然,我们要从创建一个工程开始,工程的创建方式和前文一致,不同的是我们选择的依赖不同,这里我们选择JPA和Rest Repositories作为依赖,如下图:



OK,Project创建成功之后接下来我们要添加数据库依赖,我这里是继续使用mysql数据库,所以继续添加mysql数据库依赖,如下:

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>

在application.properties中数据库配置相关属性

这里配置和我们在上文中介绍的配置方式一致,如下:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rest
spring.datasource.username=root
spring.datasource.password=123456

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true

和我们在上文中介绍的配置方式一模一样,这里的东西如果小伙伴有不理解的可以参考这篇博客初识在Spring Boot中使用JPA,我在这里不再赘述。

创建实体类

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private Integer age;
    private String address;

    public Person() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Person(Long id, String name, Integer age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }
}

实体类也是和上文介绍的一模一样,不再赘述。做好这些操作之后,运行我们的Project就可以在数据库中生成相应的表了,为了方便我们测试,我写了个简单的方法用来批量生成sql插入语句,方便我们后面做测试用,如下:

public class Test {
    public static void main(String[] args) {
        String[] addrss = new String[]{"西安", "北京", "郑州", "上海", "武汉", "长沙", "广州", "贵阳", "柳州", "咸阳", "蓝田", "渭南"};
        String[] names1 = new String[]{"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈"};
        String[] names2 = new String[]{"强", "亚", "哲", "凡", "路", "举", "昕", "科", "武", "田"};
        Random random = new Random();
        for (int i = 0; i < 100; i++) {
            System.out.println("insert into person(address,name,age) values('" + addrss[random.nextInt(addrss.length)] + "','" + names1[random.nextInt(names1.length)]+ names2[random.nextInt(names2.length)] + "','" + (20 + random.nextInt(70)) + "');");
        }
    }
}

运行该方法生成100条数据库插入语句,拷贝到数据库管理器中执行即可。

创建实体类的Repository

这个也和上文(初识在Spring Boot中使用JPA)中介绍的一模一样,而且还简单了许多,只提供了一个方法,如下:

public interface PersonRepository extends JpaRepository<Person,Long> {
    List<Person> findByNameStartsWith(@Param("name") String name);
}

OK,做完这一切我们就可以测试了。不对,等等,我好像什么都没干呀,完全就是普通的JPA操作呀,这就是Spring Boot的便利之处,你是什么都不用干,直接测试你的Project吧。

测试

测试工具安装

REST测试工具多种多样,firefox和chrome上都有相应的插件,我这里以firefox上的RESTClient插件为例,我们先来看看安装过程:





工具安装对于各位智商杠杠滴的程序员来说应该没有什么难度,安装成功之后在浏览器的工具栏中会多出一个图标,如下:



点击该按钮,打开测试页面:

获取所有数据

在地址栏中访问http://localhost:8080/persons获取所有数据,如下图:



在Response Body (Raw)一栏中我们可以看到访问结果。

根据id获取单条数据

在地址栏中访问http://localhost:8080/persons/1获取id为1的数据,如下图:

查询数据

如果我们想调用刚刚自定义的PersonRepository中的方法来执行查询操作,那么只需对该方法稍作修改将之暴露为REST资源即可,如下:

public interface PersonRepository extends JpaRepository<Person,Long> {
    @RestResource(path = "nameStartsWith",rel = "nameStartsWith")
    List<Person> findByNameStartsWith(@Param("name") String name);
}

然后假设我们需要查询所有姓钱的人,那么在地址栏输入如下地址:http://localhost:8080/persons/search/nameStartsWith?name=钱,访问结果如下:

分页查询

在地址栏输入http://localhost:8080/persons/?page=1&size=3进行分页查询,其中1表示第1页,3表示每页3条数据,查询结果如下:



在查询结果中,系统还给我们返回了首页地址、上页地址、下页地址以及尾页地址,如下:

排序查询

比如按照age字段从大到小排序,在地址栏输入这个http://localhost:8080/persons/?sort=age,desc,查询结果如下:

向数据库添加数据

上面我们演示的所有请求都是get请求,向数据库添加数据我们需要通过post请求,修改请求方式,然后在请求body中输入要提交的json字符串。同时我们还要告诉服务端,客户端提交的数据格式是json,所以在RESTClient工具的头部点击Headers,选择自定义头信息,如下:



然后添加Content-Type,如下:



OK,添加完头信息之后,就可以发起请求了,请求地址如下:http://localhost:8080/persons,访问结果如下:



如此之后,我们就向数据库中添加了一条数据了。

数据更新

通过put请求我们可以更新数据,假设我要更新id为99的数据,输入如下地址可以更新http://localhost:8080/persons/99,在请求body中传入修改参数,结果如下:



修改成功之后,数据库中该条数据随即变化。

数据删除

通过delete请求我可以删除一条数据,假设我要删除id为55的数据,先将请求改为delete请求,然后在地址栏输入如下地址http://localhost:8080/persons/55,结果如下:

这样,id为55的数据就被删除了。

定制

上面我们说了基本的请求,默认情况下我们访问所有数据的请求路径是http://localhost:8080/persons,如果想定制,我们可以在application.properties中进行配置,配置方式如下:

spring.data.rest.base-path=/api

这样,我的访问路径就变为了http://localhost:8080/api/persons.默认情况下我们是在实体类后面添加一个s形成路径,比如这里我们的实体类是Person,访问路径就是persons,有的时候我们需要对这个路径进行定制,这个可以在PersonRepository类中通过注解进行修改,如下:

@RepositoryRestResource(path = "people")
public interface PersonRepository extends JpaRepository<Person,Long> {
    @RestResource(path = "nameStartsWith",rel = "nameStartsWith")
    List<Person> findByNameStartsWith(@Param("name") String name);
}

OK ,经过上面两个定制操作之后,我的访问路径就变成这样了http://localhost:8080/api/people,访问结果如下:

简单吧。

本文案例下载:

本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test23-REST

更多Spring Boot资料请移步这里从SpringMVC到Spring Boot

以上。

参考资料:

《JavaEE开发的颠覆者 Spring Boot实战》第八章

在Spring Boot中输出REST资源的更多相关文章

  1. Spring Boot 中的静态资源到底要放在哪里?

    当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥Spring Boot 中的静态资源加载问题:"松哥,我的HTML页面好像没有样式?& ...

  2. Spring Boot中的静态资源文件

    Spring Boot中的静态资源文件 1.SSM中的配置 2.Spring Boot 中的配置 2.1 整体规划 2.2 源码解读 2.3 自定义配置 2.3.1 application.prope ...

  3. 在Spring Boot中使用数据库事务

    我们在前面已经分别介绍了如何在Spring Boot中使用JPA(初识在Spring Boot中使用JPA)以及如何在Spring Boot中输出REST资源(在Spring Boot中输出REST资 ...

  4. Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置

    当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥 Spring Boot 中的静态资源加载问题:"松哥,我的 HTML 页面好像没有样 ...

  5. Spring Boot 中初始化资源的几种方式(转)

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  6. Spring Boot中静态资源(JS, 图片)等应该放在什么位置

    Spring Boot的静态资源,比如图片应该放在什么位置呢, 如果你放在传统WEB共的类似地方, 比如webapp或者WEB-INF下,你会得到一张示意文件未找到的破碎图片.那应该放哪里呢? 百度一 ...

  7. Spring Boot 中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  8. Spring Boot实战:静态资源处理

    前两章我们分享了Spring boot对Restful 的支持,不过Restful的接口通常仅仅返回数据.而做web开发的时候,我们往往会有很多静态资源,如html.图片.css等.那如何向前端返回静 ...

  9. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

随机推荐

  1. DVA框架统一处理所有页面的loading状态

    dva 有一个管理 effects 执行的 hook,并基于此封装了 dva-loading 插件.通过这个插件,我们可以不必一遍遍地写 showLoading 和 hideLoading,当发起请求 ...

  2. 【贪心】Codeforces 349B.Color the Fence题解

    题目链接:http://codeforces.com/problemset/problem/349/B 题目大意 小明要从9个数字(1,2,--,9)去除一些数字拼接成一个数字,是的这个数字最大. 但 ...

  3. MySQL中的字符串函数

    使用字符串数据 当使用字符串数据时,可以使用下面的字符数据类型. CHAR 固定长度.不足部分使用空格填充的字符串. varchar 变长字符串. text(MySQL和SQL Server)或CLO ...

  4. CentOS在线安装JDK

    一.通过yum命令在线安装jdk 1.查看云端目前支持安装的jdk版本 [root@localhost ~]# yum search java|grep jdk ldapjdk-javadoc.noa ...

  5. PyCharm 2018 永久激活

    PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制. ...

  6. Redis常用命令--Keys

    Redis是一个key-value型的数据库. 所以在Redis也提供了很多操作key的命令,大概有22个. EXISTS key [key ...]:查询一个key是否存在,时间复杂度为O(1),存 ...

  7. UVA11795 Mega Man's Mission

    状压dp #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...

  8. ●BZOJ 1855 [Scoi2010]股票交易

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1855 题解: DP,单调队列优化.(好久没做 DP题,居然还意外地想出来了) 定义 dp[i ...

  9. hdu5666 BestCoder Round #80

    Segment  Accepts: 418  Submissions: 2020  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6553 ...

  10. n个并发进程共用一个公共变量Q,写出用信号灯实现n个进程互斥的程序描述,给出信号灯值得取值范围,并说明每个取值范围的物理意义。

    答: var mutex: semaphore:=1; begin cobegin process i : begin   // i = 1,2,……,n repeat P(mutex); 对公共变量 ...