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

栏目: Java · 发布时间: 7年前

内容简介:一.Restful简介REST是一种Web软件结构风格,而不是一种标准,匹配或兼容这种架构风格称之为REST服务,REST服务简洁并且有层次,REST通常基于HTTP,URI和XML以及HTML这些现有的广泛流行的协议和标准,在REST中,资源是由URI来指定的,对资源的增删改查也是通过HTTP协议提供的POST,PUT,GET,DELETE等方法实现,使用REST可以更高效率的利用缓存来提高响应速度,同时REST中的通信会话状态有客户端来维护,这可以让不同服务器来处理一系列请求中的不同请求,进而提高服务器

一.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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

The Apache Modules Book

The Apache Modules Book

Nick Kew / Prentice Hall PTR / 2007-02-05 / USD 54.99

"Do you learn best by example and experimentation? This book is ideal. Have your favorite editor and compiler ready-you'll encounter example code you'll want to try right away. You've picked the right......一起来看看 《The Apache Modules Book》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器