架构之:REST和HATEOAS
简介
我们知道REST是一种架构方式,它只是指定了六种需要遵循的基本原则,但是它指定的原则都比较宽泛,我们需要一种更加具象的约束条件来指导我们的编码。这就是HATEOAS。
HATEOAS简介
REST的英文全称是REpresentational State Transfer,表示的是状态的转移。而HATEOAS的全称是Hypertext As The Engine Of Application State,表示使用超文本作为应用程序的状态。这样两者就关联起来了。HATEOAS指定了状态的表现形式。
超文本就是链接,在HATEOAS的规则下,所有的资源请求都是需要带上链接的,这些链接表示可以对该资源进行的下一步操作。并且,这些链接是动态变化的,根据请求资源的不同而不同。所以,如果你的架构实现了HATEOAS风格的话,可以继续减少client和server端的接口依赖关系。因为所有可以进行的操作都已经放在返回资源的超链接中了。
我们举个例子,还是请求students的例子,假如我们请求:
GET /students/zhangsan HTTP/1.1
Host: api.rest.com
Accept: application/json
那么返回的json可能是下面这样子的:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: ...
{
"student": {
"student_id": 11111,
"age": 10,
"links": {
"school": "/student/11111/school"
}
}
}
可以看到返回的信息包含student本身的信息和相关的links信息,里面含有Student的school信息。客户端可以通过返回的links继续向下获取更多的信息。
如果我们访问另外一个student,看下返回结果有什么不同:
GET /students/lisi HTTP/1.1
Host: api.rest.com
Accept: application/json
那么返回的json可能是下面这样子的:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: ...
{
"student": {
"student_id": 2222,
"age": 20,
"links": {
"school": "/student/2222/school",
"vote": "/student/2222/vote",
}
}
}
看到有什么不同了吗? 这次学生的age=20 ,所以拥有的选举的权限,这次在我们的links里面多了一个vote链接。
links会根据资源的不同发送变化,客户端不需要知道任何服务器端的逻辑,每个请求都包含了所有可以继续执行的操作,从而让客户端和服务器端彻底解耦。
在现实世界中,当您访问一个网站时,您会点击它的主页。它提供了一些快照和网站其他部分的链接。您单击它们,然后您将获得更多信息以及与上下文相关的更多相关链接。
类似于人与网站的交互,REST客户端访问初始API URI并使用服务器提供的链接动态发现可用操作并访问所需的资源。客户不需要事先了解服务或工作流中涉及的不同步骤。此外,客户端不再需要对各种资源的URI结构进行硬编码。 HATEOAS允许服务器在不中断客户端的情况下随着API的发展进行URI更改。
HATEOAS的格式
HATEOAS有两个比较重要的格式,分别是RFC 5988 (web linking) 和 JSON Hypermedia API Language (HAL)。
他们稍有不同,但是原理是大同小异的。感兴趣的朋友可以自行查阅。
HATEOAS的Spring支持
人民需要什么,Spring就造什么。同样的,对于REST+HATEOAS这种优美组合,怎么能够少得了Spring的身影呢?
Spring推出了Spring HATEOAS来实现这一功能。最新的版本是1.3.0,如果你使用的Spring boot,那么使用起来将会更加的简单,引用下面的XML就可以了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
<version>2.5.1</version>
</dependency>
如果是非Spring boot环境,则可以这样引用:
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
<version>1.3.1</version>
</dependency>
在Spring HATEOAS中提供了一系列非常有用的特征来帮助我们创建Link,从而减轻我们的工作。有关Spring HATEOAS的具体内容,我们会在后面的文章中详细讲解。
总结
如果你使用的REST架构,那么配合上HATEOAS规则应该就是最好的组合。祝你成功。
本文已收录于 http://www.flydean.com/03-rest-hateoas/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
架构之:REST和HATEOAS的更多相关文章
- 使用REST风格架构您需要知道的一些事
1. REST的由来 2. REST的构成 2.1. 资源 2.2. 资源的表述 2.2.1. MIME(Multipurpose Internet Mail Extensions) 2.2.2. 缓 ...
- 架构模式之REST架构
直至今日,分布式系统(Distributed System)已经取得了大规模的应用,特别是Web的发展,已经给软件开发带来了翻天覆地的变化,这一点已经毋庸置疑了. 构建分布式系统常用的技术通常就是使用 ...
- Spring REST实践之HATEOAS
HATEOAS HATEOAS(The Hypermedia As The Engine Of Application Statue)是REST架构的主要约束."hepermedia&quo ...
- RestFul && HATEOAS && Spring-Data-Rest介绍
1.什么是RestFul 经常上网的同学会发现,现代软件的一个重要趋势就是互联网化,几乎没有一款软件是纯粹的单机版了.通常的情况下,软件管理着服务器的资源以及这些资源的状态变化,用户通过在浏览器输入h ...
- 理解本真的REST架构风格
http://kb.cnblogs.com/page/186516/ 引子 在移动互联网.云计算迅猛发展的今天,作为一名Web开发者,如果您还没听说过“REST”这个buzzword,显然已经落 ...
- Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...
- 使用静态基类方案让 ASP.NET Core 实现遵循 HATEOAS Restful Web API
Hypermedia As The Engine Of Application State (HATEOAS) HATEOAS(Hypermedia as the engine of applicat ...
- restful架构风格设计准则(六)版本管理
读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 版本管理 在前面已经提到过,一个REST系统为资源所抽象出的URI实际上 ...
- restful架构风格设计准则(四)资源表示和资源访问
读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 一.资源表示 1.资源表示:使用 单数 vs. 复数 如果一个URL所对 ...
随机推荐
- LeetCode:322. 零钱兑换
链接:https://leetcode-cn.com/problems/coin-change/ 标签:动态规划.完全背包问题.广度优先搜索 题目 给定不同面额的硬币 coins 和一个总金额 amo ...
- 如果你这么去理解HashMap就会发现它真的很简单
Java中的HashMap相信大家都不陌生,也是大家编程时最常用的数据结构之一,各种面试题更是恨不得掘地三尺的去问HashMap.HashTable.ConcurrentHashMap,无论面试题多么 ...
- 『无为则无心』Python基础 — 4、Python代码常用调试工具
目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...
- NOIP模拟测试24「star way to hevaen·lost my music」
star way to heaven 题解 大致尝试了一下并查集,记忆化搜索,最小生成树 最小生成树是正解,跑最小生成树然后找到最大的值 欧几里德距离最小生成树学习 prim楞跑 至于为什么跑最小生成 ...
- Docker笔记--操作容器命令
Docker笔记--操作容器命令 创建容器 docker [container] create-- 创建容器,使用docker [container] create命令新建的容器处于停止状态,可以使用 ...
- VRRP简介以及配置案例
一.背景 二.VRRP 概念介绍 三.实验操作 一.背景 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络,如果此时默认网关设备发生故障,将中断所有用户终端的网络访问,这很可能会给用户带来 ...
- js笔记10
1.闭包 封装:减少代码的冗余,提高代码的重复利用率 继承:本来需要开辟多个空间,只需要开辟一个空间,减少内存的消耗,提高性能 函数归属:函数归属谁,跟他在哪调用没有关系,而跟他在哪定义有关 闭包的定 ...
- python读取txt文件绘制散点图
方法和画折线图类似,差别在于画图函数不一样,用的是scatter() import matplotlib.pyplot as plt #以外部两个txt表分别作为x,y画图n=0m=0with ope ...
- ps2020 将图片中的字清除 并且不损坏背景图
步骤:1:使用选框工具选中要删除的字:2:选择-->色彩范围,选中字体颜色 :3.选择-->修改-->扩展:4.图片区域,右键填充--内容识别--确定: 1.使用选框工具选中要删除 ...
- jquery 选择器 模糊匹配
根据name值匹配 1.查询前缀为aa的数据 $("div[name^='aa']"); 2.查询后缀为aa的所有div的jquery对象 $("div[name$='a ...