HATEOAS 是一个难以发音的缩写,代表“超文本作为应用程序状态引擎”。 HATEOAS 由 Roy Fielding 于 2000 年发明,被提议作为基于网络的软件系统的架构风格。
这种架构风格的核心概念是超文本。 通过超文本,我们对可能暗示操作的编码内容。 反过来,每个动作都意味着状态的改变。 HATEOAS 代表了可用于控制从一个应用程序状态到另一个应用程序状态的转换的机制。 它的名称包含“引擎”一词,基于超文本可以驱动状态之间转换的假设。
为什么选择 HATEOAS?
HATEOAS 成为理想的架构风格的原因有多种。 两个主要原因是
- 晚期绑定
- 统一接口
1. 晚期绑定
脆弱的系统总是劣质工程的标志。 当我们发现脆弱的系统时,通常会发现其组成组件和子系统紧密耦合(几乎焊接在一起)。 这种紧密的耦合会产生大量的摩擦,从而产生大量的“热量”。 难怪这种脆弱的系统以其有缺陷的行为而闻名,而这种行为通常被认为是故障。 而且这些缺陷通常很难排除故障和修复。
但是什么导致了紧密耦合? 在大多数情况下,它是早期绑定。 我们有时将早期绑定称为过早优化(正如俗话所说,它是万恶之源)。 因此,为了避免设计和构建脆弱的系统,我们应该避免紧密耦合,实际上这意味着我们应该避免早期绑定或过早优化。
HATEOAS 是极端晚期绑定设计风格的一个主要例子。 使用 HATEOAS 风格构建的系统完全解耦且未经过过早优化,这使它们可以灵活地安全地进行更改。
2. 统一接口
客户端和服务器之间的接口充当统一代理,从而模糊了客户端假设或理解资源结构的需求。 统一的接口使客户端无需了解有关服务器的任何信息。
此外,统一的接口将识别与交互完全分离。 在统一的接口中,在后端实现的资源由唯一的资源标识符 (URI) 标识。 对后端资源提供的服务感兴趣的客户端只需要知道起始端点(主 URI)。 客户端无需了解有关如何与资源交互的任何详细信息。
与晚期绑定一样,统一的接口提供了弹性、非脆弱的解决方案。 以 HATEOAS 风格构建的系统可以自由地彻底修改其结构,而不会对客户端造成丝毫干扰。
带内和带外信息
与 HATEOAS 相关的另一个重要概念是带内与带外信息访问。 如果调用者(例如客户端)需要操作资源(例如服务器),则客户端的意图必须以某种方式转换为实现。 如果客户端知道他们想要做什么或完成什么,那么他们接下来关心的问题就变成:如何做。
可以通过两种方式来实现这种如何做事的方式的知识
- 客户端需要绕道以获取操作指南信息(带外)
- 客户端由资源(带内)按照及时通信模型提供操作指南信息
由于 HATEOAS 是一种晚期绑定、统一接口的设计风格,因此它以带内方式提供操作指南信息。 这意味着调用客户端无需在启动交互之前了解如何与资源交互的任何详细信息。
相比之下,传统的远程过程调用 (RPC) 设计取决于带外安排——调用客户端必须在启动交互之前获取与服务器交互所需的详细信息。 换句话说,调用客户端仅知道如何开始与服务器的交互是不够的; 还希望客户端在进行获取所需服务的精确调用之前了解所有必要的详细信息。
调用客户端在对服务器进行任何调用之前必须拥有的这种预先知识使系统变得非常脆弱。 客户端和服务器紧密耦合; 服务器不能随意修改其 API,并且必须格外小心以保持向后兼容性。
HATEOAS 的带内设计理念的一部分是自描述消息。 客户端不必了解有关服务器状态的任何信息; 自描述消息代表客户端继续与服务器交互所需的重要点。
这种安排进一步放松了客户端(调用者)和服务器之间任何可能的耦合。
HATEOAS 如何工作?
HTML 的工作方式与 HATEOAS 的工作方式没有区别。 当我们浏览网络时,我们从一个入口点(URL)开始。 Web 浏览的第一步包括指示 Web 浏览器向指定的 URL 发送 HTTP GET 请求。
收到该 HTTP GET 请求后,后端资源(服务器)会回复 HTTP 响应。 该 HTTP 响应既包含数据,也可能(而且很可能)包含可以在该数据上执行的网络操作。 这些网络操作被编码为超文本链接。 如果我们然后单击其中一个链接,我们就会执行网络操作:浏览器代表我们发送另一个 HTTP 请求(它可以是 GET 请求,也可以是 POST 请求等)。
这种对普通 Web 浏览体验的描述中的突出点是,我们(客户端)无需提前了解有关服务器上实现的结构的任何信息。 我们所知道的就是服务器以资源表示(HTML 文档)的形式发送给我们的超文本链接。
用计算机程序替换 Web 浏览器,您就可以了解 HATEOAS 的工作方式。 客户端(例如,计算机程序)获取资源的入口点(API 的端点)。 然后,客户端以编程方式向资源发送 HTTP GET 请求并接收 HTTP 响应。 在响应中,客户端将找到一个或多个超文本链接。 正是这些超文本链接使调用程序可以更改应用程序状态。 客户端通过使用资源表示(HTML 文档)中找到的带内详细信息发送另一个 HTTP 请求来进行更改。
逐步地,客户端和服务器之间的交互以这种方式继续进行。
HATEOAS 有哪些优点?
除了上述优点(邀请无风险更改的非脆弱、弹性系统)之外,HATEOAS 还能够构建以下系统
- 高性能
- 可扩展
- 可靠
- 易于理解
- 透明
- 可移植
这些优点是通过使用 HATEOAS 风格构建的系统的无状态特性实现的。
评论已关闭。