一.Restful简介
REST是一种Web软件结构风格,而不是一种标准,匹配或兼容这种架构风格称之为REST服务,REST服务简洁并且有层次,REST通常基于HTTP,URI和XML以及HTML这些现有的广泛流行的协议和标准,在REST中,资源是由URI来指定的,对资源的增删改查也是通过HTTP协议提供的POST,PUT,GET,DELETE等方法实现,使用REST可以更高效率的利用缓存来提高响应速度,同时REST中的通信会话状态有客户端来维护,这可以让不同服务器来处理一系列请求中的不同请求,进而提高服务器的扩展性,在前后端分离项目中,一个好的项目必然遵循REST架构风格
在Spring Mvc框架中,开发者可以提供RestController注解开发一个RESTful服务,不过Spring Boot对此提供了自动化配置方案,开发者只需要添加相关依赖即可快速构建一个RESTful服务
二.JPA实现REST
在Spring Boot中使用Spring Data JPA和Spring Data Rest可以快速开发一个RESTful服务。
1.基本实现
(1)创建项目:创建Spring Boot项目,添加如下依赖

<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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
         <!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency> 

(2)这里的依赖除了添加了数据库相关依赖外还有Spring Data Jpa以及Spring Data Rest的依赖,项目建成后,接下来在配置文件中进行配置,配置如下:

server.port=8088

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/spring_vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=********

spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.open-in-view=true
spring.jpa.properties.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

2.创建实体类

@Entity
@Data
@Table(name = "book")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "author")
    private String author;

    @Column(name = "price")
    private float price;

}

3.创建BookRepository

public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor{

}

(3)这里继承了JpaRepository,JpaSpecificationExecutor,在JpaRepository中包含了很多现成的增删改查的方法
4.测试
经过上面的步骤,简单的RESTful架构就已经完成了,接下来进行测试:
(1)添加测试,这里我们使用的Postman,RESTful构建成功后,默认的请求路径是实体类名小名加上s,向数据库添加一条数据很容易,发起一个post请求,并写入要添加的数据即可,这里数据以JSON格式为准,如下:

构建RESTful服务(使用Spring Data JPA)

总结:路径:localhost:8088/books,格式:JSON,请求类型:post
(2)分页查询测试,查询是Get请求,分页查询请求路径实体类小写加s,这里为/books,分页查询的每页默认记录数为20条,页数是0,测试如下:

构建RESTful服务(使用Spring Data JPA)

总结:请求类型GET,无参数,路径:localhost:8088/books
(3)根据id查询,若是根据id进行查询,只需要路径后边缀id即可,路径如下:

构建RESTful服务(使用Spring Data JPA)

总结:路径:localhost:8088/books/4,类型:GET
(4)分页查询扩展,添加查询页数,条数,以及添加排序,也是只需要后缀参数即可
构建RESTful服务(使用Spring Data JPA)

总结:路径:localhost:8088/books?page=1&size=3,请求类型:GET
除了分页以外还可以添加排序,如下:

构建RESTful服务(使用Spring Data JPA)

总结:路径:localhost:8088/books?page=1&size=3&sort=id,desc,类型:GET
(5)修改测试,修改需要发送PUT请求,因为修改是根据id进行的,因此路径中需加入id,然后传入修改数据(JSON格式),如下:
构建RESTful服务(使用Spring Data JPA)

总结:路径:localhost:8088/books/15,请求参数图中所示,请求类型:PUT
(6)删除测试,使用DELETE请求可以实现对数据的删除操作,例如删除id为1的记录,路由如下:localhost:8088/books/11
5.自定义请求路径
默认情况下,请求路径都是实体类名加s,如果开发者想对路径进行重定义,通过@RepositoryResource注解可实现

@RepositoryRestResource(path="bs",collectionResourceRel="bs",itemResourceRel="bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor{

}

代码解释:@RepositoryResource注解的path属性表示将所有请求路径中的books都修改为bs(localhost:8088/bs),collectionResourceRel表示将返回的JSON集合中book集合的key修改为bs,itemResourceRel表示将返回的JSON集合中单个book的key修改为b

构建RESTful服务(使用Spring Data JPA)

6.自定义查询方法
默认的查询方法支持分页查询,排序查询以及按照id查询,如果开发者想要按照某个属性查询,只需要在BookRepository中定义相关方法并暴露出去即可,代码如下:

@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor {
    @RestResource(path = "author", rel = "author")
    public List<Book> findByAuthor(@Param("author") String author);
}

代码解释:
自定义查询只需要在BookRepository中定义查询方法即可,方法定义好之后可以不添加@RestResource注解,默认路径就是方法名,以上述自定义方法为例,若是不添加@RestResource注解,则默认该方法调用路径为:localhost:8088/bs/search/findByAuthor?author=金庸,如果添加注解,对方法查询路径自定义,其中path就是最新路径,如上方法,他的访问路径为:localhost:8088/bs/search//author?author=金庸 ,如下:

构建RESTful服务(使用Spring Data JPA)

注意:用户可以通过访问:localhost:8088/bs/search,查询目前都暴露了哪些查询方法

7.隐藏方法
(1)默认情况下,继承了Repository接口或是其子类的类都会被暴露出来,即开发者可以执行基本的增删改查方法,如果开发者不想暴露此接口类对对象的操作各种方法,那么就可以作如下配置:

@RepositoryRestResource(exported=false)
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor {
}

这样此接口里边的所有方法都会失效
(2)若是只是不想暴露某一个方法,就可以在此方法上加注解@RestResource,在注解中设定exported=false,这样这个方法就会失效,如下:

@Override
    @RestResource(exported=false)
    void deleteById(Integer id);

8.配置CORS(跨域支持)
所有方法支持跨域访问,在接口上加@CrossOrigin注解如下:

@CrossOrigin
@RepositoryRestResource(path = "bs")
public interface BookRepository extends JpaRepository<Book, Integer>, JpaSpecificationExecutor {
    @RestResource(path = "author", rel = "author")
    public List<Book> findByAuthor(@Param("author") String author);

}

(2)单某些方法支持跨域,在要支持的方法上加@CrossOrigin注解
9.其他配置
开发者可以为了方便开发添加常用属性,如下:

spring.data.rest.default-page-size=2
spring.data.rest.page-param-name=path
spring.data.rest.sort-param-name=sort
spring.data.rest.limit-param-name=size
spring.data.rest.base-path=/api
spring.data.rest.return-body-on-create=true
spring.data.rest.return-body-on-update=true