构建RESTful服务(使用Spring Data JPA)
一.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项目,添加如下依赖
org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-rest org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime com.alibaba druid 1.1.10 org.projectlombok lombok true
(2)这里的依赖除了添加了数据库相关依赖外还有Spring Data Jpa以及Spring Data Rest的依赖,项目建成后,接下来在配置文件中进行配置,配置如下:
server.port=8088spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.url=jdbc:mysql://localhost:3306/spring_vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=falsespring.datasource.username=rootspring.datasource.password=********spring.jpa.hibernate.ddl-auto=updatespring.jpa.database=mysqlspring.jpa.show-sql=truespring.jpa.open-in-view=truespring.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, JpaSpecificationExecutor{}
(3)这里继承了JpaRepository,JpaSpecificationExecutor,在JpaRepository中包含了很多现成的增删改查的方法
4.测试
经过上面的步骤,简单的RESTful架构就已经完成了,接下来进行测试:
(1)添加测试,这里我们使用的Postman,RESTful构建成功后,默认的请求路径是实体类名小名加上s,向数据库添加一条数据很容易,发起一个post请求,并写入要添加的数据即可,这里数据以JSON格式为准,如下:
总结:路径:localhost:8088/books,格式:JSON,请求类型:post
(2)分页查询测试,查询是Get请求,分页查询请求路径实体类小写加s,这里为/books,分页查询的每页默认记录数为20条,页数是0,测试如下:
总结:请求类型GET,无参数,路径:localhost:8088/books
(3)根据id查询,若是根据id进行查询,只需要路径后边缀id即可,路径如下:
总结:路径:localhost:8088/books/4,类型:GET
(4)分页查询扩展,添加查询页数,条数,以及添加排序,也是只需要后缀参数即可
总结:路径:localhost:8088/books?page=1&size=3,请求类型:GET
除了分页以外还可以添加排序,如下:
总结:路径:localhost:8088/books?page=1&size=3&sort=id,desc,类型:GET
(5)修改测试,修改需要发送PUT请求,因为修改是根据id进行的,因此路径中需加入id,然后传入修改数据(JSON格式),如下:
总结:路径: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, JpaSpecificationExecutor{}
代码解释:@RepositoryResource注解的path属性表示将所有请求路径中的books都修改为bs(localhost:8088/bs),collectionResourceRel表示将返回的JSON集合中book集合的key修改为bs,itemResourceRel表示将返回的JSON集合中单个book的key修改为b
6.自定义查询方法
默认的查询方法支持分页查询,排序查询以及按照id查询,如果开发者想要按照某个属性查询,只需要在BookRepository中定义相关方法并暴露出去即可,代码如下:
@RepositoryRestResource(path = "bs")public interface BookRepository extends JpaRepository, JpaSpecificationExecutor { @RestResource(path = "author", rel = "author") public List findByAuthor(@Param("author") String author);}
代码解释:
自定义查询只需要在BookRepository中定义查询方法即可,方法定义好之后可以不添加@RestResource注解,默认路径就是方法名,以上述自定义方法为例,若是不添加@RestResource注解,则默认该方法调用路径为:localhost:8088/bs/search/findByAuthor?author=金庸,如果添加注解,对方法查询路径自定义,其中path就是最新路径,如上方法,他的访问路径为:localhost:8088/bs/search//author?author=金庸 ,如下:
注意:用户可以通过访问:localhost:8088/bs/search,查询目前都暴露了哪些查询方法
7.隐藏方法
(1)默认情况下,继承了Repository接口或是其子类的类都会被暴露出来,即开发者可以执行基本的增删改查方法,如果开发者不想暴露此接口类对对象的操作各种方法,那么就可以作如下配置:
@RepositoryRestResource(exported=false)public interface BookRepository extends JpaRepository, 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, JpaSpecificationExecutor { @RestResource(path = "author", rel = "author") public List findByAuthor(@Param("author") String author);}
(2)单某些方法支持跨域,在要支持的方法上加@CrossOrigin注解
9.其他配置
开发者可以为了方便开发添加常用属性,如下:
spring.data.rest.default-page-size=2spring.data.rest.page-param-name=pathspring.data.rest.sort-param-name=sortspring.data.rest.limit-param-name=sizespring.data.rest.base-path=/apispring.data.rest.return-body-on-create=truespring.data.rest.return-body-on-update=true