REST简介
REST是一种Web软件架构风格,它是一种风格,而不是标准,匹配或兼容这种架构风格的网络服务称为REST服务。REST服务简洁并且有层次,REST通常基于HTTP、URI、和XML以及HTML这些现有的广泛流行的协议和标准。在REST中资源是由URI来指定的,对资源的增删改查可以通过HTTP协议提供的GET、POST、PUT、DELETE等方法实现。使用REST可以更高效地利用缓存来提高响应速度,同时REST中的通信会话状态由客户端来维护,这可以让不同的服务器处理一系列请求中的不同请求,进而提高服务器的扩展性。
在SpringMVC框架中,开发者可以通过@RestController注解开发一个RESTful服务。
JPA
- 创建项目、添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
</dependencies>
- application.properties配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=xml123xml
spring.datasource.url=jdbc:mysql:///jparestful
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database=mysql
- 实体类
@Entity(name = "t_book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String author;
//省略setter、getter
}
- BookRepository
@NoRepositoryBean
public interface BookRepository<T, ID> extends JpaRepository<T, ID> {
}
这样来看基于RESTful的增删改查、分页查询方法JpaRepository都提供了
- 测试
使用postman测试 -
增 Post
-
删 DELETE
-
改 PUT
-
查 GET
自定义请求路径
默认情况下,请求路径都是实体类名小写加s,如果想要对请求路径进行重新定义,可通过@RepositoryRestResource注解实现
修改BookRepository
@RepositoryRestResource(path = "bs",collectionResourceRel = "bs",itemResourceRel = "b")
public interface BookRepository extends JpaRepository<Book, Integer> {
}
- path:表示将所有请求路径中的books都改为bs
- collectionResourceRel表示将返回的JSON集合中book集合的key修改为bs
-
itemResourceRel表示将返回的JSON集合中的单个book的key修改为b
自定义查询方法
如果需要自定义的方法,只需要在BookRepository中定义相关方法并暴露出去
@RepositoryRestResource(path = "bs",collectionResourceRel = "bs",itemResourceRel = "b")
public interface BookRepository extends JpaRepository<Book, Integer> {
@RestResource(path = "author",rel = "author")
List<Book> findByAuthorContains(@Param("author")String author);
}
- 自定义查询只需要在BookRepository中定义相关查询方法即可,方法可以不加@RestResource注解。默认路径就是方法名。若不添加@RestResource,则查询路径为:http://localhost:8080/bs/search/findByAuthorContains?author=author12。若添加@RestResource(path="author",rel="author")则查询路径为:http://localhost:8080/bs/search/author?author=author3.
path:表示自定义方法的路径
rel表示属性可以对这里的路径进行重定义
隐藏方法
默认情况下,继承Repository接口(Repository的子类)都会被暴露出来,即开发者可执行基本的增删改查方法。如果继承了Repository但是又不想暴露相关操作
@RepositoryRestResource(path = "bs",collectionResourceRel = "bs",itemResourceRel = "b")
public interface BookRepository extends JpaRepository<Book, Integer> {
@RestResource(path = "bcd",exported = false)
List<Book> findByAuthorContains(@Param("abc")String author);
}
- @RepositoryRestResource注解中的exported属性置为false之后,上面的所有接口都会失效。如果单纯地不想暴露某个方法,则在方法上进行配置即可。@RestResource注解的exported属性默认为true,设置为false即可
配置CORS
以前实现跨域访问需要使用@CrossOrigin注解,另一种是全局配置。默认RESTful工程不需要开发者自己提供Controller,因此添加在Controller的方法上的@CrossOrigin注解可以直接写在BookRepository上。
此时,BookRepository中的所有方法都支持跨域。如果只需某一个方法支持跨域,那么将@CrossOrigin注解添加到某一个方法上即可。