(十)在SpringBoot2中输出REST资源

一、简介

前面我们我们已经看了Spring Boot中的很多知识点了,也见识到Spring Boot带给我们的各种便利了,今天我们来看看针对在Spring Boot中输出REST资源这一需求,Spring Boot带给我们哪些惊喜呢?最近这些文章是成一个系列的,如果小伙伴还没看前面几篇博客,读懂本文可能会有一些压力。

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

 

 

二、创建工程

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

 

工程创建好之后,添加 Druid 依赖,完整的依赖如下:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </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>

 

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

spring.datasource.url=jdbc:mysql://localhost:3306/springboot?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# JPA配置
spring.jpa.database=mysql
# 在控制台打印SQL
spring.jpa.show-sql=true
# 数据库平台
spring.jpa.database-platform=mysql
# 每次启动项目时,数据库初始化策略
spring.jpa.hibernate.ddl-auto=update
# 指定默认的存储引擎为InnoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

 

创建实体类

package com.example.springboottest10.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    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插入语句,方便我们后面做测试用,如下:

package com.example;

import java.util.Random;

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

package com.example.springboottest10.repository;

import com.example.springboottest10.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

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

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

 

 

三、测试

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

 

 

 

 

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

 

 

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

 

 

1.获取所有数据

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

 

 

2.根据id获取单条数据

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

 

3.查询数据

如果我们想调用刚刚自定义的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=钱,访问结果如下: 

 

4.分页查询

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

 

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

这里写图片描述

 

5.排序查询

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

 

 

6.向数据库添加数据

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

 

 

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

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

 

7.数据更新

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

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

 

8.数据删除

通过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类中通过注解进行修改,如下:

import com.example.springboottest10.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;
import java.util.List;

@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,访问结果如下:

 

 

 

五、设置某些接口不开放

当我们想让某些接口不开放,比如删除接口,不想开放给外面访问时,我们可以通过在Repository重写delete方法,添加上注释

@RestResource(exported = false)    如下:
import com.example.springboottest10.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;

import java.util.List;

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

    @RestResource(exported = false)
    @Override
    void delete(Person person);
}

 

然后我们访问测试

发现返回状态是405,说明访问失败。

 

 

 

学习借鉴自https://blog.csdn.net/u012702547/article/details/54023654

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值