HATEOAS简介

之前restful理解_数据库_黄腾霄的博客-CSDN博客和大家介绍了对RESTful的理解。今天和大家介绍下RESTful中最重要的一个概念HATEOAS。


什么是HATEOAS

HATEOAS是Hypermedia as the Engine of Application State的缩写。

翻译过来就是超媒体即应用状态引擎

那这个是什么样的一个东西呢?

我们先来看一个现实中的问题。

问题来源

我们在项目开发中经常需要涉及同后端对接API。

对接的过程一般都是后端的同学给出一个文档,告诉我们有哪些API,可以获得什么样子的参数。

试想一下,如果有一天后端同学新增加了API,但是没有给这个API文档,那你该怎么办?

所以说API文档,成为了前后端对接的耦合因素。

HATEOAS解决什么问题

HATEOAS通过超媒体来提供客户端与服务器之间的交互。

即客户端可以通过一个简单的初始URI,并从返回值获取可以操作的其他信息。

这样一来,我们对接后端时,就几乎不需要额外的信息。

可以进一步实现前后端的解耦。

Richardson Maturity Model中,HATEOAS为于最高层,可以显著提升RESTful API的可发现性和响应的自解释性。

HATEOAS例子

说了这么多大家可能还不是很了解,这里我们举个例子。

假设我们有这么一个API,可以返回一个人和他孩子的名字。

GET /people/huangtengxiao

<person>
    <name>huangtengxiao</name>
    <children>
        <name>xiaohuang</name>
    </children>
</person>

那按照RESTfulAPI的方式,我们可以通过POST方法给他添加孩子

POST /people/huangtengxiao/children/xiaoxiaohuang
GET /people/huangtengxiao

<person>
    <name>huangtengxiao</name>
    <children>
        <name>xiaohuang</name>
        <name>xiaoxiaohuang</name>
    </children>
</person>

但是如果我们后台模式设置了约束,即每家只能生2个小朋友,那么这里继续调用post就会出问题。

POST /people/huangtengxiao/children/xiaoxiaohuang

<message>too many children</message>

但是这个约束是后台模型才能知道,客户端根本不知道是否有这样的约束。

此外如果之后服务端的约束变更为3个小朋友,那客户端除了尝试post也不能知道后端约束的变化。

使用HATEOAS

如果我们使用HATEOAS,这个例子会怎么样?

GET /people/huangtengxiao

<person>
    <name>huangtengxiao</name>
    <children>
        <name>xiaohuang</name>
    </children>
    <links>
    	<link rel="addChild" href="children/:name" type="POST"/>
    	<link rel="addPet" href="pets/:name" type="POST"/>
    </links>
</person>

看到区别了么,使用HATEOAS的RESTful API 不但返回了我们所需的数据,还额外返回了一个links数组。

很容易我们可以从里面看到客户端可以做的操作,例如在"children/:name"这个链接进行post,可以添加一个child。

而且我们还发现了可以在"pets/:name"这个链接进行post,可以添加一个pet。

这个是之前我们都没有发现的。

POST /people/huangtengxiao/children/xiaoxiaohuang
GET /people/huangtengxiao

<person>
    <name>huangtengxiao</name>
    <children>
        <name>xiaohuang</name>
        <name>xiaoxiaohuang</name>
    </children>
    <links>
    	<link rel="addPet" href="pets/:name" type="POST"/>
    </links>
</person>

当我们添加一个child之后,我们发现links中只剩下了addPet这一个功能了。

因为后端模型发现当前的children已经达到约束,因此,返回的响应中只给出了可执行的操作。

所以现在客户端可以更据返回的响应,决定自己的行为,真正实现了后端模型驱动。

HATEOAS实现

HATEOAS目前还只是一个guide,目前可以有各种类型的实现。

其中Hypertext Application Language - Wikipedia 是一种目前有较广影响的草案。

大家有兴趣也可以参考。


参考文档:


本文会经常更新,请阅读个人博客原文: https://xinyuehtx.github.io/ ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HATEOAS(Hypermedia as the Engine of Application State)是RESTful架构中的一个重要概念,它表示客户端可以通过从服务器返回的超媒体链接来发现和执行可用操作。 在实现HATEOAS的过程中,需要满足以下要求: 1. 响应中包含完整的超媒体信息:在响应中包含完整的超媒体信息,包括资源的URI、资源类型、可用操作等内容。 2. 超媒体格式的标准化:为了确保客户端能够正确地解析和使用超媒体信息,需要使用标准化的超媒体格式,如HAL、JSON-LD等。 3. 客户端自动发现:客户端应该能够自动发现和执行可用操作,而不需要先了解API的设计和实现。 4. 服务器端控制:服务器端应该控制超媒体信息的生成和更新,以确保超媒体信息的正确性和一致性。 实现HATEOAS的过程中,可以采用以下步骤: 1. 使用标准化的超媒体格式:选择一种标准化的超媒体格式,如HAL、JSON-LD等,并按照规范定义超媒体信息的结构和内容。 2. 在响应中包含完整的超媒体信息:在API的响应中包含完整的超媒体信息,包括资源的URI、资源类型、可用操作等内容。 3. 客户端自动发现:客户端通过解析响应中的超媒体信息,自动发现和执行可用操作。 4. 服务器端控制:服务器端控制超媒体信息的生成和更新,以确保超媒体信息的正确性和一致性。 总之,实现HATEOAS需要在API设计和实现的过程中充分考虑超媒体信息的生成、标准化、响应和解析,以便客户端能够自动发现和执行可用操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值