架构之: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所对 ...
随机推荐
- python+selenium基础篇,cookie绕过验证码小案例
1.绕过验证码有许许多多的方法,笔者在此介绍其中的一个小方法,原理其实就是获取已登陆了之后的凭证(会话保存在本地的cookie中)再打开另一个页面的使用 2.F12(浏览器开发者调试工具)可以查看的需 ...
- 【NX二次开发】基准特征
创建基准特征UF_MODL_create_fixed_daxis 创建一个固定的基准轴特征,方向由点1指向点2UF_MODL_create_fixed_dplane 创建一个固定的基准面特征,输入点和 ...
- PTA7~9题目集总结与归纳
前言: 总结三次题目集的知识点.题量.难度等情况. 目录: 题目集7(7-1).(7-2)两道题目的递进式设计分析总结 题目集8和题目集9两道ATM机仿真题目的设计思路分析总结 一. 题目集7(7-1 ...
- 无需会员将有道云笔记脑图转换xmind
我的烦恼 有道云笔记有脑图功能,我平时经常用到,之所以很少用到其他脑图工具,是因为我一直用有道云笔记写笔记.因此编辑脑图和查看脑图比较方便,但是需要将脑图导出的时候目前只支持图片和xmind,但是需要 ...
- 记Aspose.Word的使用中出现的问题
最近实现一个功能,具体需求就是把数据库中的内容转换成word文档,文档中需要包含标题.目录以及表格信息. 这里我使用的是Aspose.Word类,这是一个很强大的文档操作工具包,实现了所有操作文档的所 ...
- Java语言实现二维码的生成
众所周知,现在生活中二维码已经是无处不见.走在街道上,随处可见广告标语旁有二维码,手机上QQ,微信加个好友都能通过二维码的方式,我不知道是什么时候兴起的二维码浪潮,但是我知道,这在我小时候可是见不到的 ...
- Java中对象调用方法的顺序
Java虚拟机会预先为加载到内存中的每个类维护一个方法表(Method Table),其中列出了所有类中所有方法的签名. 现在有2个类A和B,其中,B是A的子类,和一个B类型的对象x,当调用x.f(a ...
- AIDL —— Android接口定义语言
AIDL:Android Interface Definition Language,即Android接口定义语言,是Android进程间通信比较常用的一种方式.翻译一下,就是为了让某个Service ...
- 生产环境部署Django项目
生产环境部署Django项目 1. 部署架构 IP地址 安装服务 172.16.1.251 nginx uwsgi(sock方式) docker mysql5.7 redis5 Nginx 前端We ...
- 13、windows下卸载oracle
13.1.停用oracle服务: 进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止: 13.2.删除oracle: 在开始菜单中,找到oracle->Universal I ...