介绍HATEOAS

转自:https://blog.csdn.net/u014427391/article/details/102650252
REST风格简介
介绍HATEOAS之前先简单介绍一下REST,REST 是 Representational state transfer 的缩写,翻译过来的意思是表达性状态转换。REST是一种架构的风格

Richardson Maturity Model
Richardson 提出了REST一种 成熟度模型,我们称之为Richardson Maturity Model,这种模式将REST按照成熟度划分为4个等级

Level0:使用HTTP作为WEB服务的传输方式,以REST样式公开SOAP Web服务
Level1:使用适当的URI(使用名词)公开资源,这种方式提出了资源的概念
Level2:资源使用正确的URI + HTTP方法,比如更新用户就用put方式,查询用get方式
Level3:使用HATEOAS(作为应用程序状态引擎的超媒体),在资源的表达中包含了链接信息,客户端可以在链接信息中发现可以执行的操作
HATEOAS是什么?
HATEOAS代表“超媒体是应用程序状态的引擎”

从前言我们已经可以清楚知道,使用HATEOAS约束是REST风格中成熟度最高的,也是官方推荐的一种方式,没使用HATEOAS的项目,服务端和客户端是耦合的,客户端只能通过相关文档来知道服务端做了什么修改,使用HATEOAS约束的REST服务,服务端修改接口信息后,客户端可以通过服务器提供的资源的表达来智能地发现可以执行的操作,客户端不需要做啥修改,因为资源信息是会动态改变的

在Spring的官网,已经有提供这个项目的相关文档,链接:https://spring.io/projects/spring-hateoas

SpringBoot HATEOAS
SpringBoot中也有集成HATEOAS,本博客介绍一下如何使用

工具准备:

JDK8.0
Maven 3.0+构建工具
Eclipse或者IntelliJ IDEA
git&gitlab
Maven相关配置
在pom.xml加上hateoas配置

org.springframework.boot spring-boot-starter-hateoas

1
2
3
4
5
因为是要写个web简单curd例子,其它需要的也加上

org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-hateoas org.springframework.boot spring-boot-starter-web com.alibaba druid 1.0.25 mysql mysql-connector-java 5.1.40
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
		<exclusions>
			<exclusion>
				<groupId>org.junit.vintage</groupId>
				<artifactId>junit-vintage-engine</artifactId>
			</exclusion>
		</exclusions>
	</dependency>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
实体类实现ResourceSupport

Model类实现hateoas提供的ResourceSuppor

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.hateoas.ResourceSupport;

import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name=“sys_user”)
public class SysUserInfo extends ResourceSupport implements Serializable{

@Id
@GeneratedValue
private Long userId;
@Column(unique=true,length=20,nullable=false)
private String username;
@Column(length=2,nullable=true)
private String sex;
@Column(length=10,nullable=true)
private String password;

public SysUserInfo(){

}

@JsonCreator
public SysUserInfo(@JsonProperty("userId")Long userId,@JsonProperty("username")String username,
                   @JsonProperty("sex")String sex,@JsonProperty("password")String password){
    this.userId = userId;
    this.username = username;
    this.sex = sex;
    this.password = password;
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
接口调用,基于HATEOAS模式

@GetMapping("/findBySysUserId/{userId}")
public SysUserInfo findBySysUserId(@PathVariable(“userId”) long userId) {
if (LOG.isInfoEnabled()) {
LOG.info(“请求参数userId : {}” , userId);
}
Optional sysUserInfo = Optional.ofNullable(sysUserRepository.findByUserId(userId));
if (!sysUserInfo.isPresent()) {
throw new NotFoundException(“查询不到用户信息! userId:”+userId);
}
//Resource resource = new Resource(sysUserInfo.get());
ControllerLinkBuilder linkBuilder = linkTo(methodOn(this.getClass()).findBySysUserId(userId));
sysUserInfo.get().add(linkBuilder.withRel(“findBySysUserId”));
return sysUserInfo.get();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

实例代码:github链接下载

————————————————
版权声明:本文为CSDN博主「smileNicky」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014427391/article/details/102650252

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值