前面我们我们已经看了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. __new__方法首先调用并返回一个实例化对象

    >>> class CapStr(str): def __new__(cls,string): string = string.upper() return str.__new__( ...

  2. __init__特殊方法

    __init__特殊方法不应当返回除了none以外的任何方法.

  3. Python面向对象——内置对象的功能扩展

    1.扩展Python内置类 Python的数据类型 列表(list).字典(dict).集合(set).文件(file).字符串(str),这些都是对象 扩展list的功能,详解如图: 我们给列表添加 ...

  4. 【省带宽、压成本专题】从产品架构来看,PCDN如何节流50%

    过去几年,我们一直在视频省流量方面潜心钻研,取得不俗的成果.本次"省带宽.压成本"系列一共会推出六篇文章,从技术迭代.硬件更新等角度出发,向大家介绍节省CDN流量,降低视频播放成本 ...

  5. angularjs中使用 <input type="file">标签实现一次最多上传5张图片

    前期准备: 1.angular.js 2.bootstrap.css 具体如何实现呢?请看下面代码哈哈哈. 在angular项目中,如果要给<input type="file" ...

  6. jQuery中的事件监听小记

    一,一个事件监听的简便写法 最近发现一个jQuery中事件监听的简洁写法,感觉方便好多.同时也深感自己基础薄弱,好多东西竟然都模棱两可.因此,记录的同时,也对jQuery事件监听做个小的总结 原文链接 ...

  7. str_replace替换换行符失败原因

    在编程中,需要替换掉字符串的换行符再存进数据库, 语句: $str = str_replace(array('/r/n', '/r', '/n'), $str); 发现语句并没有替换,网上查找后,知道 ...

  8. Android Studio安装、配置、第一个程序的那些坑

    最近在上Android课,老师布置了量大题难的作业,然而出师未捷身先死,还没看题目,就被Android Studio的安装和环境配置搞得要死要死的,网上的教程也多也杂,良莠不齐,在经历了5小时通过的搜 ...

  9. 【The Time Traveller's Wife】

    After reading The Time Traveller's Wife:      It's a tragedy,I think.But it's mixed with hope.Henry ...

  10. poj 2104 主席树(区间第k大)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 44940   Accepted: 14946 Ca ...