zoukankan      html  css  js  c++  java
  • 在Spring Boot中输出REST资源

    前面我们我们已经看了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实战》第八章

  • 相关阅读:
    Vue数据绑定和响应式原理
    JavaScript实现MVVM之我就是想监测一个普通对象的变化
    缓存的理解
    理解promise 02
    线段与线段的交点
    线段与线段交点的推导公式
    promise你懂了吗?
    wx import require的理解
    webgl example1
    sublime2常用插件
  • 原文地址:https://www.cnblogs.com/lenve/p/7530979.html
Copyright © 2011-2022 走看看