超媒体与 HATEOAS

响应中携带可用状态转移的链接(_links),客户端由服务端指引决定下一步可做什么;适合状态机明显的业务接口,实现与理解成本较高。

什么是超媒体与 HATEOAS

HATEOAS(Hypermedia as the Engine of Application State)指响应中携带可用状态转移的链接,客户端不预置 URL 规则,而是按服务端给出的链接决定下一步能做什么。它是 Richardson 成熟度模型的第 3 级。适合状态机明显、步骤有限的业务流程;实现与理解成本较高,投入前要评估收益。

基本信息

表现形式响应内 _links 字段给出可用操作与目标地址
核心思想服务端控制状态转移,客户端按链接驱动
适用条件流程状态明确、需要服务端引导下一步操作
主要顾虑客户端实现复杂度与前端框架生态支持有限

典型使用场景

  • 订单状态流转:不同状态下可用操作不同,由响应决定可做什么
  • 审核工作流:待审、通过、驳回等状态由服务端给出可用动作
  • 版本演进:新增或调整路径时,客户端无需修改 URL 拼接逻辑
  • 多端共用:移动端与网页端都按链接驱动,减少路径硬编码
  • 权限可见性:无权操作时不展示对应链接,减少无效请求
  • 对外接口:为第三方提供自描述接口,降低文档与联调成本

响应示例

响应示例
{
  "id": "1001",
  "status": "pending",
  "amount": 1280.00,
  "_links": {
    "self":   { "href": "/orders/1001" },
    "cancel": { "href": "/orders/1001/cancel", "method": "POST" },
    "pay":    { "href": "/orders/1001/payment", "method": "POST" }
  }
}
// 客户端按 _links 决定可执行操作;服务端仍必须逐请求鉴权

使用前提与代价

方面要求说明
状态机流程状态清晰且转移有限状态模糊时链接集合难以定义
客户端按链接驱动而非拼路径需要客户端框架与团队习惯配合
鉴权链接可见性只是提示服务端必须做真实权限校验
文档链接语义要被说明缺少说明时客户端仍不知道操作含义
链接可见性可承担部分授权提示(不展示无权操作),但服务端仍必须做真实鉴权,否则链接可被直接构造调用。
链接地址硬编码域名或环境前缀,环境迁移或域名变更时会导致大量链接失效。

易错点

  • 前端只认展示不校验动作,取消类链接可被越权直接调用
  • 链接 URL 硬编码域名,环境迁移后大量失效
  • 状态机定义不清就引入超媒体,链接集合随需求变化反复改
  • 只加链接不写语义说明,客户端仍需靠猜或读源码理解操作含义

数据来源与参考

  • Leonard Richardson & Mike Amundsen《RESTful Web APIs》
  • Roy Fielding 博士论文(2000)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌