HATEOAS
超媒體即應用狀態引擎(英語:Hypermedia as the Engine of Application State,縮寫HATEOAS)是表現層狀態轉換(REST)的一個約束條件,用以將它和其他網絡應用架構區分開來。
使用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]
實現
[編輯]另見
[編輯]參考資料
[編輯]- ^ 1.0 1.1 1.2 Fielding, Roy T. REST APIs must be hypertext-driven. 20 Oct 2008 [20 May 2010]. (原始內容存檔於2023-01-12).
- ^ 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.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).
- ^ GitHub上的Siren: a hypermedia specification for representing entities
- ^ Collection+JSON - Hypermedia Type. [2021-10-25]. (原始內容存檔於2022-10-24).
- ^ JSON API: Latest Specification. [2021-10-25]. (原始內容存檔於2023-01-01).
- ^ Hydra: Hypermedia-Driven Web APIs. [2021-10-27]. (原始內容存檔於2023-01-09).