前面我们我们已经看了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. 非黑即白--谷歌OCR光学字符识别

    # coding=utf-8 #非黑即白--谷歌OCR光学字符识别 # 颜色的世界里,非黑即白.computer表示深信不疑. # 今天研究一下OCR光学识别庞大领域中的众多分支里的一个开源项目的一个 ...

  2. round()函数 浮点数的四舍五入

    浮点数的四舍五入 print round(1.7333) 2.0

  3. Batch训练的反向传播过程

    Batch训练的反向传播过程 本文试图通过Softmax理解Batch训练的反向传播过程 采用的网络包含一层全连接和一层softmax,具体网络如下图所示: 交叉熵成本函数: \[L = - \fra ...

  4. springboot--mybatis--pagehelper分页整合不起作用

    今天配置pagehelper,在pom文件中都使用的最新版本jar包,步骤都没问题,之后才发现是包的问题. 有问题:分页配置不起作用 <dependency> <groupId> ...

  5. [C#]设计模式-简单工厂-创建型模式

    在设计模式当中有三大工厂,分别是 简单工厂.抽象工厂.工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现. 简单工厂一般由以下几个对象组 ...

  6. jQuery中的for循环var与let的区别

    今天在写jQuery请求接口中发现一个问题: 在用AJAX发送请求中又嵌套了一个AJAX请求,发现在内层请求的success中对第一次success中的循环变量 i 无法获取,具体代码如下: $.aj ...

  7. [HAOI 2011]Problem b

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  8. ●BZOJ 4310 跳蚤

    ●赘述题目 给出一个字符串,要求分成k个子串,然后求出每个子串的字典序最大的子串(我称它为子子串),要使这k个子子串中的字典序最大的那个串(即魔力串)最小.输出该魔力串. (本题个人感觉很好,比较综合 ...

  9. [BZOJ]3671 随机数生成器(Noi2014)

    洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...

  10. bzoj1767[Ceoi2009]harbingers 斜率优化dp

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 112[Submit][S ...