HATEOAS

超媒体即应用状态引擎（英語：Hypermedia as the Engine of Application State，缩写HATEOAS）是表现层状态转换（REST）的一个约束条件，用以将它和其他网络应用架构（英语：Applications architecture）区分开来。

使用HATEOAS，客户端与网络应用程序交互，其应用程序服务器通过超媒体（Hypermedia）动态提供信息。除了对超媒体的一般理解之外，REST客户端几乎不需要关于如何与应用程序或服务器交互的先验知识。

相比之下，通用对象请求代理架构（CORBA）中的客户端和服务器通过文档或接口描述语言（IDL）共享的固定接口进行交互。

HATEOAS施加的限制将客户端和服务器分离。这使服务器功能能够独立发展。

## 示例

[编辑]

一个实现了 HTTP 协议的用户代理能够通过简单的 URL 发出 REST API 的 HTTP 请求。用户代理所有后续可能发出的请求都能够在每个请求的响应中被发现。用于这些表示的 媒体类型 以及它们可能包含的 链接关系 是标准化的。客户端通过从表示中的链接中进行选择或通过以其媒体类型提供的其他方式操纵表示来转换应用程序状态。通过这种方式，RESTful 交互是由超媒体驱动的，而不是带外信息。[1]

例如，此 GET 请求获取帐户资源，请求 JSON 表示形式的详细信息：[2]

GET /accounts/12345 HTTP/1.1
Host: bank.example.com

响应为：

HTTP/1.1 200 OK

"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 100.00

"links": {
"deposits": "/accounts/12345/deposits",
"withdrawals": "/accounts/12345/withdrawals",
"transfers": "/accounts/12345/transfers",
"close-requests": "/accounts/12345/close-requests"

响应包含后续可能访问的链接：发布存款、取款、转账或关闭请求（关闭账户）。<片段 0025 ¶>

再如，若帐户已被透支，则只有一组不同的可用链接：

HTTP/1.1 200 OK

"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": -25.00

"links": {
"deposits": "/accounts/12345/deposits"

在其当前“状态”中，现在只有一个链接可用：存入更多的钱（通过 POST 到存款），而其他链接不可用。因此，术语“应用程序状态引擎”。表示随着资源状态的不同，可能采取的行动也不同。

客户端不需要了解服务器提供的每种媒体类型和通信机制。理解新媒体类型的能力可以在运行时通过服务器提供给客户端的“code-on-demand”来获得。[3]

## 起源

[编辑]

HATEOAS 约束是 Roy Fielding 博士论文中定义的 REST 的“统一接口”特性的重要组成部分。[3] Fielding 在他的文章中深入描述了这个概念。[1]。

Fielding 解释说，这种和其他 REST 约束的一些严格性的目的是“数十年规模的软件设计：每个细节都旨在促进软件寿命和独立进化。许多约束直接与短期效率相关。不幸的是，人们在短期设计方面相当擅长，而在长期设计方面通常很糟糕”。[1]

## 实现

[编辑]

* HAL
* JSON-LD
* Siren[4]
* Collection+JSON[5]
* JSON:API[6]
* Hydra[7]

## 另见

[编辑]

* 超文本应用程序语言
* 通用描述发现和集成等效于Web服务描述语言（WSDL）

## 参考资料

[编辑]

1. ^ 1.0 1.1 1.2 Fielding, Roy T. REST APIs must be hypertext-driven. 20 Oct 2008  [20 May 2010]. （原始内容存档于2023-01-12）.
2. ^ Thijssen, Joshua. What is HATEOAS and why is it important for my REST API?. REST CookBook. 2016-10-29  [2020-02-05]. （原始内容存档于2022-10-30）.
3. ^ 3.0 3.1 Fielding, Roy Thomas. Representational State Transfer (REST). Architectural Styles and the Design of Network-based Software Architectures (学位论文). University of California, Irvine. 2000  [2022-10-18]. （原始内容存档于2020-01-22）.
4. ^ GitHub上的Siren: a hypermedia specification for representing entities
5. ^ Collection+JSON - Hypermedia Type.  [2021-10-25]. （原始内容存档于2022-10-24）.
6. ^ JSON API: Latest Specification.  [2021-10-25]. （原始内容存档于2023-01-01）.
7. ^ Hydra: Hypermedia-Driven Web APIs.  [2021-10-27]. （原始内容存档于2023-01-09）.