专栏首页黄腾霄的博客2020-5-11-HATEOAS简介

2020-5-11-HATEOAS简介

之前2020-5-6-restful理解 - huangtengxiao和大家介绍了对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/post/HATEOAS%E7%AE%80%E4%BB%8B.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何避免写出await await

    小伙伴们应该对C#中的await/async模式都很熟悉了,对于一个Task或者Task<T>对象,使用await进行异步任务的等待

    黄腾霄
  • 2019-7-24-为啥在Code Behind进行RelativeSource的binding会丢失

    不知道是不是有小伙伴遇到过这样的情况。当我们尝试将一个RelativeSource从xaml转到code behind时,原本好好的binding表达式居然出现...

    黄腾霄
  • 2019-5-30-UML基础

    在面向对象的软件分析及设计中,UML是一种产品、架构、开发、测试之间高效、可视化的沟通工具。UML的体系庞大,部分图形的学习曲线较为陡峭,导致在实际使用中容易出...

    黄腾霄
  • 设计模式-组合模式(Composite)

    定义 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

    高广超
  • java设计模式(11)-组合模式

    这篇文章分享一下组合模式,具体类似于树形的数据结构,二叉树中有具体运用,有兴趣的可以翻阅资料。

    爱敲代码的猫
  • JQuery分析及实现part3之属性模块功能及实现

    ihoey
  • react入门(五):事件处理、条件渲染、列表&keys、表单

    柴小智
  • 基于Echarts4.0实现旭日图

    昨天Echarts4.0正式发布,随着4.0而来的是一系列的更新,挑几个主要的简单说明: 1.展示方面通过增量渲染技术(4.0+)ECharts 能够展现千万级...

    李文杨
  • torch tensor的repeat和expand

    一般情况下,如果expand和repeat都能得到目标矩阵,则在不更改目标矩阵元素(只读用法)时使用expand, 其他情况时使用repeat.

    用户4363240
  • GCloud的设计目的

    提高游戏服务器端逻辑的开发效率 ? 游戏服务器端有三个常用的典型功能,几乎每个游戏都要反复实现的。而这几个功能,都会符合一些最佳建模和最佳实践: 客户端拉取服...

    韩伟

扫码关注云+社区

领取腾讯云代金券