来源:互联网 更新时间:2026-07-01 08:41
REST(Representational State Transfer)自2000年由Roy Fielding博士提出以来,已经成为事实上的API开发标准方案。其中HATEOAS(Hypermedia as the Engine of Application State)对资源的导航和发现做了详尽定义——但说实话,26年过去了,这套规范虽然依然广泛应用,但在一些细节上已经有些跟不上现代需求了。

举个例子,核心约束HATEOAS本意是实现资源的自发现和导航,可实际用处相当有限。一些严谨的系统会在返回中增加导航链接,但大部分系统基本忽略了这个机制。即便是那些尊重导航链接的API实现,返回的链接也往往缺乏通用性,局限性很明显。
本规范试图在这个基础上,对资源进行概念性的细分和明确定义,从而描述一套完整的资源自发现规则,让前端可以通过API获取完整且详尽的资源列表和资源定义。这样一来,前端完全可以采用一个通用的、固定的框架来处理任意的REST资源定义。符合本规范的情况下,后端可以随时调整API内容,前端则无需任何变更,自动适应后台的最新API。
需要说明的是,超媒体契约(RHC)并不适合所有场景。它的理想目标是:后端API可以任意快速迭代变更,前端无需做任何修改即可体现后端API的效果——解决的是前后端耦合过紧导致开发流程冗长缓慢的问题。在这个场景下,API的调用方称为前端,也就是一个最终的端点,没有后续的业务依赖。
对于不适用超媒体契约的场景,典型例子:后端A提供的API由后端B调用,那么后端B的相关业务甚至它提供的API都可能依赖于后端A的API。这种情况下,完全自动的API自发现、自适应可能会带来风险蔓延、业务断层等危险。这时候更适用文档化、固化不变的API定义。
超媒体契约最经典的应用场景是管理后台,尤其是硬件类、后台服务类的运维管理。这种场景下,前端是比较确定的网页应用,不存在下一步的业务依赖。另一个典型应用是为AI提供服务——API接口自带说明,给AI调用带来极大便利性。
REST将一切用途统一为资源,所有操作都是针对资源的标准化操作。这种高层抽象让不同类型的应用都能用清晰一致的思路来解决问题。
超媒体契约(RHC)则是在这一层上做进一步的拆分和定义。它把REST中单一的资源概念细分为
具体来说,在REST中一个API端点可能是 /api/v1/erm/account,这个全路径就是一个完整的端点。但从超媒体契约来看,这个全路径里的 /api、/api/v1、/api/v1/erm 都是空间,都有含义。
在RHC中,实体依然是原有的概念(这意味着完整兼容REST)。但对于空间,超媒体契约将其定义为包含子空间和实体的容器,且支持统一的枚举操作。换句话说,你可以直接访问空间API /api/v1/erm/,它会统一返回该空间下的所有子空间和实体,比如 user、account、order、flow,以及 finance(namespace)、salary(namespace)等等。
额外补充一点:超媒体契约需要一个
ls、cd 来发现并查看任意文件一样。因此,超媒体契约中需要明确定义根到底是 /api、/api/v1 还是 /api/v1/erm,只有明确了根,才能开始发现所有实体资源。而对REST来说,只需要一个完整路径 /api/v1/erm/account,从哪儿开始完全不关心。
超媒体契约的起点位置。前端从这儿开始发现所有资源。根必然是空间,因此叫根空间,理解上可以视为根目录。
空间是实体的容器。空间本身只具备一个统一的操作:枚举其包含的内容(可能是其他空间,也可能是实体)。理解上可以视为文件夹、目录。空间的定义让REST更加层次化——通过空间将API分组,概念上更清晰。调用空间URL的API,可以有一套通用且标准化的行为,比如返回空间的详情,包括包含哪些子API等。这个是不受业务约束的顶层通用维度。如果是业务相关的,则可以自定义分组的规则在空间API上,比如权限控制、分组策略等。
等同于REST的资源概念。
RFC2616、7231、5789、9110中定义的HTTP方法共八种:GET、POST、PUT/PATCH、DELETE、HEAD、OPTIONS、TRACE、CONNECT。REST没有明确定义方法,但基于“万物皆资源”的思想,绝大多数研发设计人员都会把它往CRUD上靠,并对齐到POST、GET、PUT/PATCH、DELETE四个方法上。这种对齐简单可靠,事实上也能解决99%以上的问题。
但仍有一些很拗口、很生硬的资源化例子,比如登录/注销、转账、上车、下车。这些操作很难用合理、可理解且有基本共识的资源去做映射。当前绝大多数系统为了尊重REST,都生造了一个资源去映射——结果反而因为难以理解,从事实上违背了REST要达成简单思想共识的目标。
超媒体契约提出一个新规范建议:新增一种基本的方法类型为
login、logout、transfer,语义明确清晰,只是类型明确定义为 executable,不能用CRUD的方法去操作,唯一的操作就是直接调用执行。
这个思路显然简单清晰,但绝大多数人一开始这么想时总会犹豫或存疑:这算RESTful吗?从概念上可以澄清一下:如果万物都是资源,资源就可以是文件。熟悉操作系统底层机制的朋友都知道,“万物皆文件(句柄)”是现代操作系统的无上利器。既然万物都可以是文件,资源又有什么例外?而文件有一个基本属性:是否可执行。可执行的就是命令,不可执行的才是图片、文本等。所有文件类型之前,先分一个大类:是否可执行。Windows用扩展名区分,Linux更纯粹,直接给一个标记位 x。操作系统中,所有文件读取到系统首先也必须区分是否是可执行文件,然后单独分区标记并做安全检查。
我们只需要将REST的资源(RHC的实体资源)增加一个类型的定义,大类就是是否可执行,就可以完美解决类似登录/注销这类RESTful语义混淆的问题。也可以认为CRUD用作业务处理不够,需要加一个X——CURDX才能完整表征业务。可执行资源类型的定义将完善REST的细节,让API定义更合理化。
对前端来说,唯一需要知道的就是后端API的根URL。由于根URL是空间资源,调用它就能获得下一级的空间和实体资源,如此遍历下去就可以发现全部API资源定义。
注1:空间的发现和枚举机制可以用通用的库实现,与业务无关。后台API只需按照固定的容器形式创建或配置API,即可自动支持枚举和发现。
注2:前端同样可以用通用库,获得根URL后自动展开API细节并适配参数。
对于HTTP API来说,CRUD的操作平面目前已有比较通用且普遍接受的映射:POST、GET、PUT、DELETE。这些映射不仅被浏览器、网关广泛支持,也符合操作平面的幂等性和安全性要求。对于X来说,其幂等性和安全性都是最难的——常规HTTP method中,没有特别适合的映射。如果只考虑幂等性和安全性,唯一可以对应的是POST。当然,也可以扩展定义单独的方法来表示X的操作平面。下面分别展开。
实现起来相当简单明了:在POST、GET、PUT、DELETE之外新增一个EXECUTE。存在的问题是,新增的自定义方法不在相关规范内,要注册成标准需要很长时间的讨论和定义,短期内无法成为标准。非标准的EXECUTE方法可能存在的隐患主要在复杂网络环境中适配性低——虽然绝大部分路由、网关、服务器不会拦截,但一些袋里、应用层网关、防火墙等有可能拦截非标准方法。在简单网络环境中,扩展EXECUTE是非常简单且实用的方法,对大部分应用来说足够。如果环境比较复杂,就要考虑兼容性和可用性了。
首先,适用于EXECUTE的常用HTTP method中,只有POST在幂等性和安全性上最符合。但POST常规上已被映射到CRUD的C,所以要细分。同时细分机制最好在HTTP标准规范中借用,这样兼容性最佳,可以无障碍运行于任何环境。向响应者增加自定义的HTTP header是最简单直接的方法,但需要自定义,同样会遇到方法1的兼容性问题,所以还不如用方法1。
在已有的HTTP header中,Content-Type无论从含义还是用法上,都非常接近资源类型的设定。因此可以从标准的HTTP header里的Content-Type中,选取规范化定义好的MIME类型来表示可执行的API资源类型。Content-Type(也叫media type)标准规范中定义的类型非常多(完整列表见IANA),其中符合可执行的标准类型有两个:application/prs.implied-executable 和 application/vnd.microsoft.portable-executable。另外要注意,Content-Type的内容比较灵活,即使填入自定义的类型,绝大多数系统也是兼容的。因此从严格标准化的角度,可以选用上述两个标准类型;一般情况下,自行定义一个 executable 也足够用。
https://mimetype.io/all-types
https://www.iana.org/assignments/media-types/media-types.xhtml
https://www.iana.org/assignments/media-types/application/vnd.microsoft.portable-executable
https://www.iana.org/assignments/media-types/application/prs.implied-executable
[^safetysecurity]: Safety安全性和Security安全性. https://srs.pub/thinking/safety-security.html
archiveofourown 实战指南:常见用法整理
币安Binance虚拟货币交易平台 币安官方APP安卓苹果下载入口
客单价碾压宝马奥迪!极氪5月交付新车34377辆:连续4个月双增长
折后价近千元 澳洲一店主将真老鼠缝到内裤上当时尚单品卖
电视剧《小欢喜》剧情介绍
如何在夸克浏览器中开启网页视频的倍速播放功能?
美好的简约网名男生(精选100个)
植物娘大战僵尸电脑端与手机端存档转移的方法
《梦幻西游》159五开五门怎么搭配-159五开五门常见搭配
欧易OKX官方网站直达入口 2026欧易官方App安卓版v7.1.0下载安装
腾讯元宝怎么用来分析股票基金的基本面信息?
盖乐世社区怎么删除帖子?盖乐世社区个人发布内容撤回步骤
wallpaper壁纸声音怎么开启
独家/李宰旭入伍前「登上孤岛服役」 惊见前辈裸体:忍不住笑了
国际贵金属走低,现货黄金价格跌0.49%
短剧《嫡女她是山大王》剧情介绍
问题:CIA币好不?Cia Protocol币今日上线:价格预测、代币经济学和未来潜力
看韩漫的APP推荐 2026免费韩漫阅读软件大全
OpenAI 调整手机端 ChatGPT,提示词可提前选 AI 响应档位
免费观看国外短视频的app有哪些 观看国外短视频的软件下载
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc