Spring-Data-REST轻松搞定RESTfulAPI

简介: 昨天同事问我有没有研究过 spring-boot-starter-data-rest,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 spring-boot-starter-data-jpa ,过一会发过两个截图过来。真的很强大,感觉这个在使用RESTful风格接口协议的微服务时都不用写Controller了。

背景


昨天同事问我有没有研究过 spring-boot-starter-data-rest,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 spring-boot-starter-data-jpa ,过一会发过两个截图过来。真的很强大,感觉这个在使用RESTful风格接口协议的微服务时都不用写Controller了。

什么是Spring Data REST


Spring Data REST是基于Spring Data的Repository,把 Repository 自动输出为REST资源,目前支持Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data GemFire、Spring Data Cassandra的 Repository 自动转换成REST服务。注意是自动。Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现。

两行代码即可实现


在网上大概了解一下,然后动手做个demo,果然是两行代码即可实现。

  • 新建一个Spring Boot项目,添加依赖
1. <parent>
2.     <artifactId>spring-boot</artifactId>
3.     <groupId>com.gemantic</groupId>
4.     <version>1.0-SNAPSHOT</version>
5. </parent>
6. 
7. <dependencies>
8.     <dependency>
9.         <groupId>org.springframework.boot</groupId>
10.         <artifactId>spring-boot-starter</artifactId>
11.     </dependency>
12. 
13.     <dependency>
14.         <groupId>org.springframework.boot</groupId>
15.         <artifactId>spring-boot-starter-web</artifactId>
16.     </dependency>
17. 
18.     <dependency>
19.         <groupId>org.springframework.boot</groupId>
20.         <artifactId>spring-boot-starter-data-rest</artifactId>
21.     </dependency>
22. 
23.     <dependency>
24.         <groupId>org.springframework.boot</groupId>
25.         <artifactId>spring-boot-starter-data-jpa</artifactId>
26.     </dependency>
27. 
28.     <dependency>
29.         <groupId>mysql</groupId>
30.         <artifactId>mysql-connector-java</artifactId>
31.         <scope>runtime</scope>
32.     </dependency>
33. 
34.     <!-- 简化代码 -->
35.     <dependency>
36.         <groupId>org.projectlombok</groupId>
37.         <artifactId>lombok</artifactId>
38.         <version>1.16.14</version>
39.     </dependency>
40. 
41.     <!-- 类似swagger -->
42.     <dependency>
43.         <groupId>org.springframework.data</groupId>
44.         <artifactId>spring-data-rest-hal-browser</artifactId>
45.     </dependency>
46. 
47.     <!-- datasource pool-->
48.     <dependency>
49.         <groupId>com.alibaba</groupId>
50.         <artifactId>druid</artifactId>
51.         <version>1.0.14</version>
52.     </dependency>
53. 
54.     <dependency>
55.         <groupId>org.springframework.boot</groupId>
56.         <artifactId>spring-boot-starter-test</artifactId>
57.         <scope>test</scope>
58.     </dependency>
59. 
60. </dependencies>
• 表结构
61. CREATE TABLE `user` (
62.   `id` bigint(20) NOT NULL AUTO_INCREMENT,
63.   `user_name` varchar(100) DEFAULT NULL,
64.   `password` varchar(100) DEFAULT NULL,
65.   `phone` varchar(100) DEFAULT NULL,
66.   `locked` tinyint(1) DEFAULT '0',
67.   PRIMARY KEY (`id`),
68.   UNIQUE KEY `idx_user_user_name` (`user_name`)
69. ) ENGINE=InnoDB AUTO_INCREMENT=1 D
  1. EFAULT CHARSET=utf8;

放点数据进去,如下图:

  • 与表对应的实体
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
 * Created by Yezhiwei on 17/10/31.
 */
@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    private String userName;
    private String password;
    private String phone;
    private Integer locked;
}
  • 创建User表对应的Repository
import com.gemantic.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
/**
 * @author Yezhiwei
 * @date 17/12/16
 */
@RepositoryRestResource(path="user")
public interface UserRepository extends JpaRepository<User, Long> {
}

自定了一个接口UserRepository 继承了JpaRepository,其中泛型中的User是实体类,Long是主键类型,在类的头部加上了一个 @RepositoryRestResource注解,并添加了一个Path为user。就这样,两行代码即可实现User实体类的RESTFul风格的所有接口。

  • 测试,访问 http://localhost:8080/user

接口中自动附带查询详情的链接

分页测试, http://localhost:8080/user?size=2&page=3

接口中同样自动附带分页的链接,分页信息

这样更便于解耦前后端,后端如果链接地址变了,前端不用改,直接用Link里面的地址访问

  • 同样,也提供了一个类似swagger的接口测试UI
<!-- 类似swagger -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-rest-hal-browser</artifactId>
</dependency>


问题:

  • 现在还不知道自动转换成REST服务有哪些缺点?
  • 自动转换成REST服务,是否支持自定义功能?
  • 还需要进一步测试与Feign一起使用的情况。
  • ......
相关文章
|
21天前
|
前端开发 Java API
6:RestFul API-Java Spring
6:RestFul API-Java Spring
133 0
|
21天前
|
Java API Maven
使用Java和Spring Boot构建RESTful API
使用Java和Spring Boot构建RESTful API
19 0
|
21天前
|
缓存 Java 关系型数据库
Spring Boot实现RESTful接口架构实战(包括REST的讲解、定义、REST服务测试)
Spring Boot实现RESTful接口架构实战(包括REST的讲解、定义、REST服务测试)
63 0
BXA
|
JSON 前端开发 安全
基于Spring的RESTful API开发
RESTful API是一种建立在HTTP协议之上的Web API。它遵循REST设计规范使用HTTP请求通过网络进行通信,实现对资源的增、删、改、查等操作。RESTful API与传统的Web API相比更具有灵活性、可扩展性与可维护性,已经成为现代Web服务的首选技术之一。
BXA
89 0
|
7月前
|
前端开发 Java API
什么是RESTful API,Spring MVC如何支持RESTful架构
RESTful API(Representational State Transfer)是一种基于HTTP协议的软件架构风格,用于设计网络应用程序的API。它强调使用标准的HTTP方法(GET、POST、PUT、DELETE等)来进行资源的操作,以及使用URI来标识资源。RESTful API的设计目标是简单、可扩展、易于理解和使用。
116 0
|
10月前
|
缓存 前端开发 Java
深入理解REST与RESTfulAPI
大学我们接触最多的就是JSP技术,它可以让我们在页面中嵌入Java代码,但是这样的技术实际上限制了我们的开发效率,因为需要我们Java工程师将html转换为jsp页面,并写一些脚本代码,或者前端代码。这样会严重限制我们的开发效率,也不能让我们的java工程师专注于业务功能的开发,所以目前越来越多的互联网公司开始实行前后端分离。
154 0
深入理解REST与RESTfulAPI
|
11月前
|
XML 设计模式 JSON
RESTful:理解REST架构风格、RESTful API
RESTful:理解REST架构风格、RESTful API
412 0
|
Java API Maven
使用Spring Boot构建RESTful API
使用Spring Boot构建RESTful API
186 0
BXA
|
缓存 前端开发 IDE
Spring MVC实现RESTful API
Spring MVC是Spring Framework的一个模块,它为Web应用程序提供了一种模型-视图-控制器(MVC)架构。通过分离模型(Model)、视图(View)和控制器(Controller)的方式,使代码易于维护和测试。同时Spring MVC还支持RESTful API的开发
BXA
107 0
|
XML JSON 前端开发
基于 Spring Boot 的 RESTful API 设计与实现
RESTful 是一种规范,符合 RESTful 的 Api 就是 RESTful Api。简单的说就是可联网设备利用 HTTP 协议通过 GET、POST、DELETE、PUT、PATCH 来操作具有 URI 标识的服务器资源,返回统一格式的资源信息,包括 JSON、XML、CSV、ProtoBuf、其他格式。 RESTful 的核心思想是,客户端发出的数据操作指令都是"动词 + 宾语"的结