简介

我们知道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的更多相关文章

  1. 使用REST风格架构您需要知道的一些事

    1. REST的由来 2. REST的构成 2.1. 资源 2.2. 资源的表述 2.2.1. MIME(Multipurpose Internet Mail Extensions) 2.2.2. 缓 ...

  2. 架构模式之REST架构

    直至今日,分布式系统(Distributed System)已经取得了大规模的应用,特别是Web的发展,已经给软件开发带来了翻天覆地的变化,这一点已经毋庸置疑了. 构建分布式系统常用的技术通常就是使用 ...

  3. Spring REST实践之HATEOAS

    HATEOAS HATEOAS(The Hypermedia As The Engine Of Application Statue)是REST架构的主要约束."hepermedia&quo ...

  4. RestFul && HATEOAS && Spring-Data-Rest介绍

    1.什么是RestFul 经常上网的同学会发现,现代软件的一个重要趋势就是互联网化,几乎没有一款软件是纯粹的单机版了.通常的情况下,软件管理着服务器的资源以及这些资源的状态变化,用户通过在浏览器输入h ...

  5. 理解本真的REST架构风格

       http://kb.cnblogs.com/page/186516/ 引子 在移动互联网.云计算迅猛发展的今天,作为一名Web开发者,如果您还没听说过“REST”这个buzzword,显然已经落 ...

  6. Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

  7. 使用静态基类方案让 ASP.NET Core 实现遵循 HATEOAS Restful Web API

    Hypermedia As The Engine Of Application State (HATEOAS) HATEOAS(Hypermedia as the engine of applicat ...

  8. restful架构风格设计准则(六)版本管理

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 版本管理 在前面已经提到过,一个REST系统为资源所抽象出的URI实际上 ...

  9. restful架构风格设计准则(四)资源表示和资源访问

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 一.资源表示 1.资源表示:使用 单数 vs. 复数 如果一个URL所对 ...

随机推荐

  1. GPU端到端目标检测YOLOV3全过程(下)

    GPU端到端目标检测YOLOV3全过程(下) Ubuntu18.04系统下最新版GPU环境配置 安装显卡驱动 安装Cuda 10.0 安装cuDNN 1.安装显卡驱动 (1)这里采用的是PPA源的安装 ...

  2. 用Taro写一个微信小程序(三)—— 配置dva

    一.关于dva dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻 ...

  3. 【NX二次开发】Block UI 指定坐标系

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  4. 【转】【NX二次开发】UFUN进度中断,单击停止可中断此操作

    队长的博客: https://www.cnblogs.com/nxopen2018/p/13174207.html 显示此对话框,点击可中断操作: 用到的ufun函数: UF_ABORT_ask_fl ...

  5. 注册中心ZooKeeper,Eureka,Consul,Nacos对比

    简介 ​ 服务注册中心本质上是为了解耦服务提供者和服务消费者.对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的.更进一步,为了支持弹性扩缩容特性,一个微服务的提供者 ...

  6. 精通Proteus仿真器件制作(3)DLL仿真模型创建

    有些人可能会想:什么叫做"DLL仿真模型之原理图符号"?我想学高级的C++创建DLL(动态链接库)仿真模型的方式,你别拦着我,不然,我可就人挡Kill人,佛挡Kill佛啦!原理图符 ...

  7. JavaScript 实现:输出斐波那契数列

    问渠那得清如许,为有源头活水来. 想要保持自己的技术活力,最有效的手段就是通过不断地输入来提供足够的养分.我们也不必刻意追求高深的或者新鲜的知识点,通过对一个基础问题的全方位多维度解析,同样也会收获不 ...

  8. 『心善渊』Selenium3.0基础 — 9、使用Seleniun中的By类定位元素

    目录 1.使用By定位的前提 2.By定位的方法 3.By定位的使用 4.复数形式的示例 我们还可以通过Seleniun测试框架中的By类,来实现页面中的元素定位. 1.使用By定位的前提 需要导入B ...

  9. SSH远程登录相关教程

    命令概述 命令 英文 ssh 用户名@ip secure shell scp 用户名@ip:文件名或路径 用户名@ip:文件名或路径 secure copy 在 Linux 中 SSH 是 非常常用 ...

  10. 全局获取HttpContext

    全局获取HttpContext 在我们平常开发中会有这样的需求,我们的Service业务层需要获取请求上下文中的用户信息,一般我们从控制器参数传递过来.如果你觉得这样就可以了,请您关闭文章. 场景 但 ...