restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素
restful rest
在這篇文章中,我們將介紹有關HATEOAS的RESTful服務的綜合文章。 超媒體是REST的秘密成分。
1.簡介
在本教程的前一部分中,我們花了一些時間來刷新有關REST體系結構樣式的基本原理的知識。 業界對REST狀態的批判性眼光揭示了一個令人失望的事實,即作為應用程序狀態引擎( HATEOAS )的超媒體 ,它的主要制約因素之一經常被完全省略。
目錄
1.簡介 2.所有這些“噪音”是什么? 3.野外的HATEOAS超媒體由嵌入在信息表示中或作為信息表示之上的應用程序控制信息的存在來定義。 分布式超媒體允許將表示和控制信息存儲在遠程位置。
https://www.ics.uci.edu/~fielding/pubs/dissertation/web_arch_domain.htm#sec_4_1_3這部分的主題是超媒體 ,尤其是HATEOAS 。 希望我們不僅可以確信它的重要性,而且可以支持許多策略,以利用超媒體功能豐富我們的REST Web服務和API。
2.所有這些“噪音”是什么?
眾所周知,無狀態是REST體系結構風格的強制性約束之一。 另一方面,絕大多數現實世界的Web服務和API必須處理狀態管理。 看起來REST忽略了現代軟件系統的現實和需求嗎?
絕對不是, REST體系結構風格承認狀態管理的重要性,并以超媒體 (應用程序狀態引擎)的形式提出了解決方案。 在服務器端, 超媒體的使用不僅通告了資源之間的關系,而且還通告了可能應用于該資源的動作。 在客戶端, 超媒體的存在帶來了可發現性方面的下一步行動,步驟或要進行的狀態轉換。 理想情況下,客戶端只需要知道一個URI入口點,其他所有內容都可以通過hypermedia來自服務器。
顯然,客戶端必須足夠聰明,才能以可行的方式瀏覽超媒體控件。 正如許多經驗豐富的Web服務和API開發人員已經注意到的那樣,對服務器的超媒體支持并不那么困難,但是對客戶端的支持卻要困難得多。
但是,在Web服務和API的上下文中, 超媒體到底是什么? 我們可以將其視為服務器隨響應發送給客戶端的附加元信息。 它主要包括相關資源的鏈接,最重要的是,適用于所討論資源以更改其狀態的上下文操作。
當我說超文本時,我的意思是信息和控件的同時呈現,從而使信息成為用戶通過其獲得選擇和選擇動作的能力。 超媒體只是文本在媒體流中包含時間錨點的擴展。 大多數研究人員都放棄了這一區別。
https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comment-718總之,這些元數據片段告訴客戶端在哪里獲取更多數據或在當前上下文中哪種操作有效。 如果您覺得這很刺激,那確實是。
因此,我們討論了什么是超媒體以及它在REST體系結構風格中的重要地位,現在是時候討論超媒體的“方式”了。
3.野外的HATEOAS
僅重申我們在上一部分中所說的內容, REST體系結構樣式要求使用超媒體 ,但未指定如何使用它。 顯然,這個漏洞必須關閉,并且多年來導致了各種樣式和規格的泛濫。 許多公司走得更遠,提出了自己的超媒體類型,藍圖和建議。
超媒體類型是MIME媒體類型,其中包含導致應用程序流的本機超鏈接語義。 例如,HTML是一種超媒體類型。 XML不是。
http://amundsen.com/hypermedia/令人驚訝的是,到目前為止,還沒有一個普遍接受的標準可以遵循,以使用超媒體元素來授權Web服務和API。 一些或多或少被廣泛采用,而另一些則占據相當狹窄的位置。 而且,大多數規范仍在發展之中,并且在進行中時被廣告宣傳。
為什么會有這么多規格,主要區別是什么? 總的來說,弊端來自細節,更具體地說,在于描述相關的資源,鏈接和動作/操作。 如何找到最適合您的? 坦白地說,選擇合適的規范會直接影響支持該規范所需的工作量。 如果是未開發的Web服務或API,您幾乎可以自由選擇。 相比之下,當您維護現有的Web服務或API并通過超媒體支持對其進行豐富的任務時,選擇突然變得非常有限(除非您擁有完全重寫的特權)。
從實現的角度來看,大多數規范都傾向于使用JSON格式來表示資源狀態和超媒體控件。 但是,有些異常值會改用HTTP協議標頭。 這當然不是由REST體系結構風格決定的,而是來自現代Web服務和API的現實,它們都是面向HTTP的。
因此,這些規格是什么?
RFC 5988(網絡鏈接)
我們將從RFC-5988:Web鏈接開始 。 它指定Web鏈接的關系類型,為它們定義注冊表,還定義HTTP頭中帶有特殊Link頭的此類鏈接的使用。 這是一個簡單的示例:
Link: <https://rentals.jcg.com/reservations>; rel="self"; title="reservations"當然,在Link標頭(或多個Link標頭)中可能編碼了多個Link ,例如:
Link: <https://rentals.jcg.com/reservations?page=1>; rel="previous"; title="previous page", <https://rentals.jcg.com/reservations?page=3>; rel="next"; title="next page"Web鏈接是引入超媒體支持的最基本,最簡單的方法。 接受新的或現有的API相當簡單,但是從功能的角度來看, Web鏈接提供的選項集非常有限,主要是簡單的關系,并且不支持動作和集合 。
哈爾
JSON超媒體API語言或HAL建立使用JSON表示超媒體控件(鏈接和資源)的約定。 它由Mike Kelly于2011年創建。Web服務和API發出HAL文檔,以便客戶端可以提取適當的鏈接,并根據它們的關系類型在它們之間進行導航。
盡管HAL規范仍處于起草階段 ,但其設計原理使其成為了由超媒體驅動的現代Web服務和API的首選之一。
HAL的主要設計目標是通用性和簡單性。 HAL可以應用于許多不同的域,并施加了滿足超媒體API關鍵要求所需的最少結構量。
https://tools.ietf.org/id/draft-kelly-json-hal-02.html您可能會猜到,資源表示形式是JSON格式的HAL文檔 ,這些文檔使用專用的媒體類型application/hal+json 。
{"_embedded": {"reservations": [ {"id": "ce5886acbb87","vehicle": "Volkswagen Golf 1.2 TSI","from": "2020-02-01","to": "2020-02-12","_links": {"self": {"href": "https://rentals.jcg.com/reservations/ce5886acbb87"},"customer": {"href": "https://rentals.jcg.com/customers/fed195a03e9d"}}}, {"id": "fc14e8ef90f5","vehicle": "BMW 325i","from": "2020-01-10","to": "2020-01-12","_links": {"self": {"href": "https://rentals.jcg.com/reservations/fc14e8ef90f5"},"customer": {"href": "https://rentals.jcg.com/customers/fed195a03e9d"}}} ]},"_links": {"first": {"href": "https://rentals.jcg.com/reservations?page=0&size=10"},"self": {"href": "https://rentals.jcg.com/reservations?page=0&size=10"},"next": {"href": "https://rentals.jcg.com/reservations?page=1&size=10"},"last": {"href": "https://rentals.jcg.com/reservations?page=1&size=10"}},"page": {"size": 10,"totalElements": 13,"totalPages": 2,"number": 0} }除此之外, HAL還支持URI模板和鏈接關系文檔。 不幸的是, HAL不提供任何行動支持(您可能聽說過的另一個名字是Provided )。 試圖填補HAL空白的衍生規范之一是HAL-FORMS 。 從本質上講,它只是HAL的擴展,通過表達方法和屬性的能力來增強它。
{ "id": "13e1892765c5", "vehicle": "Honda Civic 2020", "from": "2020-01-01", "to": "2020-01-05", "_links": { "customer": { "href": "https://rentals.jcg.com/customers/fed195a03e9d" }, "self": { "href": "https://rentals.jcg.com/reservations/13e1892765c5" } }, "_templates": { "default": { "method": "put", "properties": [ { "name": "from","regex" : "yyyy-MM-dd","required": true}, { "name": "to","regex" : "yyyy-MM-dd","required": true}, { "name": "vehicle" } ] }, "delete": { "method": "delete", "properties": [ ] } } }請注意, HAL-FORMS旨在僅顯示針對同一資源(或URI)可用的操作。 如果是JSON表示形式,則會為HAL-FORMS分配專用的媒體類型application/prs.hal-forms+json 。
JSON:API
JSON:API是受超媒體支持的Web服務和API的最廣泛支持的標準之一。 它最初是由Yehuda Katz于2013年起草的,此后越來越受歡迎。 您可能會猜到,它僅適用于JSON表示形式。
JSON:API旨在最大程度地減少請求數量和客戶端與服務器之間傳輸的數據量。 在不影響可讀性,靈活性或可發現性的情況下實現了這種效率。
https://jsonapi.org/format/JSON:API規范描述了鏈接,資源關系和資源修改(相當于動作)的語義。 另外,它涵蓋了表示錯誤的方式。
{ "data": { "id": "13e1892765c5", "type": "reservation", "links": { "self": "https://rentals.jcg.com/reservations/13e1892765c5"}, "attributes": { "from": "2020-01-01", "to": "2020-01-05", "vehicle": "Honda Civic 2020" }, "relationships": { "customer": { "links": { "self": "https://rentals.jcg.com/reservations/13e1892765c5/relationships/customer", "related": "https://rentals.jcg.com/reservations/13e1892765c5/customer" } } } } }使JSON:API脫穎而出的原因在于,考慮了諸如排序,過濾,稀疏字段集和分頁之類的獲取(查詢)模式,這些模式也是規范的一部分。
{"data": [{"id": "ce5886acbb87","type": "reservation","links": {"self": "https://rentals.jcg.com/reservations/ce5886acbb87"},"attributes": {"from": "2020-01-01","to": "0120-01-12","vehicle": "Volkswagen Golf 1.2 TSI"},"relationships": {"customer": {"links": {"self": "https://rentals.jcg.com/reservations/ce5886acbb87/relationships/customer","related": "https://rentals.jcg.com/reservations/ce5886acbb87/customer"}}}},{"id": "fc14e8ef90f5","type": "reservation","links": {"self": "https://rentals.jcg.com/reservations/fc14e8ef90f5"},"attributes": {"from": "2020-01-10","to": "2020-01-12","vehicle": "BMW 325i"},"relationships": {"customer": {"links": {"self": "https://rentals.jcg.com/reservations/fc14e8ef90f5/relationships/customer","related": "https://rentals.jcg.com/reservations/fc14e8ef90f5/customer"}}}}],"links": {"first": "https://rentals.jcg.com/reservations?page[limit]=2","last": "https://rentals.jcg.com/reservations?page[limit]=2&page[offset]=2","next": "https://rentals.jcg.com/reservations?page[limit]=2&page[offset]=2"},"meta": {"totalResourceCount": 3} }公平地說, JSON:API具有非常簡單,可讀和可理解的格式。 為了實現這種權衡,它做出了一些明智的決定。 例如,您不會直接在JSON:API文檔中看到操作。 實際上,它們根據HTTP協議是隱式和隱式的: POST用于創建, PATCH用于修改, DELETE用于刪除。 這可能會給客戶帶來一些解釋上的困難,例如, PUT在哪里 ?
盡管JSON:API規范的1.0版在2015年嶄露頭角,但它正在積極地研究之中,并被認為是一個不斷發展的文檔。 JSON:API已正確注冊了媒體類型名稱application/vnd.api+json并且還擁有自己的JSON模式 定義 。
JSON-LD
JSON-LD是鏈接數據的基于JSON的序列化,在2014年就獲得了W3C候選正式建議的地位。它可能是最活躍的社區,而該規范的最新版本JSON-LD 1.1的字面意思是已發布。一個月前。 JSON-LD設計背后的關鍵原則強調能夠輕松集成到已經使用JSON的現有系統中,并使用JSON-LD語義對其進行擴充而不會破壞已建立的聯系的能力。
可以肯定地說, JSON-LD比鏈接媒體更多的是鏈接數據,而不是超媒體,但是它具有豐富的表達信息,上下文和關系的能力非常符合某些超媒體的承諾。
{ "@context": { "@vocab": "http://schema.org/" }, "@type": "Reservation", "id": "13e1892765c5", "vehicle": "Honda Civic 2020", "from": "2020-01-01", "to": "2020-01-05", "customer": { "@id": "https://rentals.jcg.com/customers/fed195a03e9d" }, "@id": "https://rentals.jcg.com/reservations/13e1892765c5" }JSON-LD的缺點之一是它缺乏對動作的支持。 Hydra解決了JSON-LD的主要缺點, Hydra是超媒體驅動的Web服務和API的詞匯。
Hydra的基本思想是提供一個詞匯表,使服務器可以將有效的狀態轉換通告給客戶端。 然后,客戶端可以使用此信息來構造HTTP請求,以修改服務器的狀態,從而實現某個所需的目標。
http://www.hydra-cg.com/spec/latest/core/#hydra-at-a-glance為了了解它是如何工作的,讓我們看一下JSON-LD文檔的快速示例,該示例已經豐富了Hydra語義。
{"@context": {"@vocab": "http://schema.org/","hydra": "http://www.w3.org/ns/hydra/core#"},"@type": "hydra:Collection","hydra:collection": [ {"@type": "hydra:Collection","@id": "https://rentals.jcg.com/reservations","hydra:manages": {"hydra:property": "self","hydra:subject": "https://rentals.jcg.com/reservations"},"hydra:operation": [ {"hydra:method": "GET"} ]} ],"hydra:member": [ {"@type": "Reservation","vehicle": "Volkswagen Golf 1.2 TSI","from": "2020-02-01","to": "2020-02-12","customer": {"@id": "https://rentals.jcg.com/customers/fed195a03e9d","hydra:operation": [ {"hydra:method": "GET"} ]},"@id": "https://rentals.jcg.com/reservations/ce5886acbb87","hydra:operation": [ {"hydra:method": "GET"}, {"hydra:method": "PUT","hydra:expects": {"@type": "UpdateReservation","hydra:supportedProperty": [ {"hydra:property": "from"}, {"hydra:property": "to"}, {"hydra:property": "vehicle"} ]}}, {"hydra:method": "DELETE"} ],"id": "ce5886acbb87"}, {"@type": "Reservation","vehicle": "BMW 325i","from": "2020-01-10","to": "2020-01-12","customer": {"@id": "https://rentals.jcg.com/customers/fed195a03e9d","hydra:operation": [ {"hydra:method": "GET"} ]},"@id": "https://rentals.jcg.com/reservations/fc14e8ef90f5","hydra:operation": [ {"hydra:method": "GET"}, {"hydra:method": "PUT","hydra:expects": {"@type": "UpdateReservation","hydra:supportedProperty": [ {"hydra:property": "from"}, {"hydra:property": "to"}, {"hydra:property": "vehicle"} ]}}, {"hydra:method": "DELETE"} ],"id": "fc14e8ef90f5"} ],"hydra:totalItems": 3,"hydra:view": {"@type": "hydra:PartialCollectionView","hydra:next": "https://rentals.jcg.com/reservations?page=1&size=2","hydra:first": "https://rentals.jcg.com/reservations?page=0&size=2","hydra:last": "https://rentals.jcg.com/reservations?page=1&size=2"} }再重申一次, JSON-LD的最強之處是數據鏈接。 與Hydra結合使用,您的Web服務和API將獲得全面的超媒體功能,但是集成可能并不像人們期望的那么容易。 JSON-LD具有保留的媒體application/ld+json 。
警笛
Siren由Kevin Swiber于2012年撰寫,是用于表示實體的超媒體規范。 Siren詞匯表中的實體是URI可尋址資源,具有與之關聯的屬性,操作和可導航鏈接。 值得注意的是, Siren是專門為Web服務和API設計的,例如,動作可以直接映射到HTTP協議動詞。
{ "class": [ "reservation" ], "properties": { "id": "13e1892765c5", "from": "2020-01-01","to": "2020-01-05", "vehicle": "Honda Civic 2020" }, "entities": [ { "rel": [ "customer" ], "href": "https://rentals.jcg.com/customers/fed195a03e9d" }, { "class": [ "customer" ], "rel": [ "http://schema.org/customer" ], "properties": { "firstName": "John", "lastName": "Smith", "id" : "fed195a03e9d" } } ], "actions": [ { "name": "update", "method": "PUT", "href": "https://rentals.jcg.com/reservations/13e1892765c5", "fields": [ { "name": "from", "type": "date" }, { "name": "to", "type": "date" }, { "name": "vehicle", "type": "text" } ] }, { "name": "delete", "method": "DELETE", "href": "https://rentals.jcg.com/reservations/13e1892765c5" } ], "links": [ { "rel": [ "self" ], "href": "https://rentals.jcg.com/reservations/13e1892765c5" } ] }盡管Siren年齡較大 ,但仍被列為進行中的工作。 它本身不像HAL或JSON:API那樣流行,但是它相對簡單和Web API優先語義使其成為值得考慮的選擇。 Siren JSON表示形式的媒體類型為application/vnd.siren+json 。
集合+ JSON
由Mike Amundsen在2011年創建的Collection + JSON規范旨在成為一種超媒體類型,旨在支持讀取,編寫和查詢簡單集合。 它受到Atom聯合格式(RFC-4287)和Atom發布協議(RFC-5023)的啟發。 關于Collection + JSON的一個有趣的事實是,它將所有內容都視為一個集合,因此,單個項目表示為一個元素的集合。
{"collection": {"version": "1.0","href": "https://rentals.jcg.com/reservations/13e1892765c5","links": [ {"rel": "customer","href": "https://rentals.jcg.com/customers/fed195a03e9d"} ],"items": [ {"href": "https://rentals.jcg.com/reservations/13e1892765c5","data": [ {"name": "from","value": "2020-01-01"}, {"name": "id","value": "13e1892765c5"}, {"name": "to","value": "2020-01-05"}, {"name": "vehicle","value": "Honda Civic 2020"} ],"links": [ {"rel": "customer","href": "https://rentals.jcg.com/customers/fed195a03e9d"} ]} ],"template": {"data": [ {"name": "from","value": ""}, {"name": "to","value": ""}, {"name": "vehicle","value": ""} ]}} }您可能會猜到, Collection + JSON標準非常適合列表和集合。 它還包括對查詢模板 (鏈接和關系)和寫模板 (操作)的支持,以及標準化的錯誤報告。
在某些時候, Collection + JSON非常流行,但是與其他替代方案相比,它實現起來可能更加困難。 同樣,對“一切都是收藏”的偏見是不直觀的。
Collection + JSON的媒體類型為application/vnd.collection+json 。
優步
UBER 超媒體類型描述了對簡單狀態轉移和臨時轉移的支持。 它是由Mike Amundsen (是Collection + JSON的作者)和Irakli Nadareishvili于2014年左右共同創建的,同時針對XML和JSON變體。
那么,作者提出另一種超媒體類型的動機是什么? 邁克·阿蒙森 ( Mike Amundsen)的這則推文使推理過程更加清晰。
Collection + JSON是高度結構化的CRUD格式。 HAL適用于內聯超媒體, Siren具有豐富的obj模型。 UBER開放且極簡。
https://twitter.com/mamund/status/456508872832716800UBER文檔支持鏈接關系,操作和錯誤報告機制。 該規范旨在與多種協議配合使用,但包含有關基于HTTP的實現和解釋的詳細指南。
{"uber": {"version": "1.0","data": [ {"name": "customer","rel": [ "customer" ],"url": "https://rentals.jcg.com/customers/fed195a03e9d"}, {"name": "self","rel": [ "self" ],"url": "https://rentals.jcg.com/reservations/13e1892765c5"}, {"name": "update","rel": [ "update" ],"url": "https://rentals.jcg.com/reservations/13e1892765c5","action": "replace","model": "from={from}&to={to}&vehicle={vehicle}"}, {"name": "delete","rel": [ "delete" ],"url": "https://rentals.jcg.com/reservations/13e1892765c5","action": "remove","model": ""}, {"name": "reservation","data": [ {"name": "from","value": "2020-01-01"}, {"name": "id","value": "13e1892765c5"}, {"name": "to","value": "2020-01-05"}, {"name": "vehicle","value": "Honda Civic 2020"} ]} ]} }自2016年以來,它仍被標記為草稿(準確地說是穩定的草稿),并且沒有太大變化。它沒有正式注冊的媒體類型,因此,如果使用JSON表示,則必須使用application/vnd.amundsen-uber+json 。
亞哈皮
有許多鮮為人知的超媒體規范仍然值得關注。 我們將從 2014年首次發布的Another Hypermedia(ish)API規范( Yahapi )開始,該規范本質上是啟用 超媒體的約定的列表。
最后, Yahapi只是使您的API看起來漂亮,簡單且一致的首選項列表。
https://github.com/Yahapi/yahapiYahapi提供了有關分頁,排序,部分結果和錯誤格式的準則列表,支持鏈接和關系,但不幸的是不支持操作。 它很少在野外發現并且不是真正活躍。 Yahapi文檔的媒體類型僅為application/json 。
石匠
Mason是一種基于JSON的格式,用于將超媒體元素引入經典的JSON數據表示中。 特別是,它包括用于鏈接和動作的超媒體元素以及標準化的錯誤處理。 Mason在媒體類型注冊表中注冊為application/vnd.mason+json 。
離子
Ion將自身定位為REST的一種基于JSON的直觀超媒體類型。 它涵蓋了關系類型的鏈接以及使用表單的操作 。 不幸的是,自2018年以來,該規范似乎處于Hibernate狀態。分配給Ion內容的媒體類型為application/ion+json 。
4. HATEOAS的成本
此時,您應該對將超媒體和HATEOAS應用于RESTful Web服務和API時的作用有一個很好的了解。 而且,如果您是從事典型企業項目的經驗豐富的軟件開發人員,您可能很難記得上一次遇到HATEOAS時的情況。 讓我們面對現實:沒有人知道如何使用超媒體 。
在REST體系結構的上下文中, HATEOAS是必須的,但它不是免費的,并且會產生成本,有時非常重要。 不僅在實施方面,而且在前期設計方面。 在這方面,服務器相對容易,但是客戶端確實很辛苦(充其量您可能會獲得Link標頭的支持)。 實際上,這意味著即使您開發完美的RESTful Web服務或API,其他開發人員也有很大可能選擇完全不在其客戶端中使用超媒體。
在本教程的這一部分中,我們討論了許多不同的超媒體規范。 除少數例外,其中大多數帶有“進行中”或“不穩定”的標簽。 總的來說,這意味著仍有黑暗的水域在航行,而您最終到達那里的機會很高。 這就是為什么要持續不斷地創建新規范的原因之一。 顯然,每個規范需要非常不同的設計和實現工作量。 希望您的編程語言或平臺生態系統已經有了一些庫和框架來幫助您入門,但總的來說并非如此。
在服務器和客戶端之間的數據交換方面, 超媒體可能會導致更多往返,以獲取鏈接和關系背后的其他詳細信息。 由于需要包括鏈接和操作,這也可能導致資源表示的大小大大增加。
您可能會問自己一個有趣的問題,即REST架構風格(尤其是HATEOAS)如何與微服務架構融合? 為了說明問題,請考慮一個只有兩個微 Customer Service的系統,即Customer Service和Reservation Service 。 由于客戶不需要任何額外的知識或前期知識,他們如何發現有多種服務? Reservation Service將如何納入與客戶相關的超媒體元素,反之亦然? 很有可能由另一層(例如API網關或/和聚合器)負責,并且聽起來確實不是一個簡單的問題。
如果此時您不懼怕超媒體和HATEOAS ,請不要擔心。 收益大大超過了所需的成本和精力,尤其是從長期來看。 作為對此的確認,讓我們看一下簡短而簡單的案例研究。
5.案例研究
我們將要分析的示例應用程序是一個汽車租賃平臺,該平臺目前僅實現兩個RESTful Web API來管理reservations和customers 。 與任何客戶端共享的唯一知識是平臺的入口點,出于演示目的,假設在偽造的URL https://rentals.jcg.com后面有服務器。
該端點僅接受HTTP GET請求并返回超媒體文檔(使用HAL和HAL-FORMS ),示例如下所示。
$ curl https://rentals.jcg.com/{ "_links": { "self": { "href": "https://rentals.jcg.com/" }, "reservations": { "href": "https://rentals.jcg.com/reservations" }, "customers" : { "href": "https://rentals.jcg.com/customers" } } }超媒體感知客戶端一旦收到此類文檔,便可以清楚地了解到可以從那里導航到兩個鏈接: reservations和customers 。 在這種情況下,客戶對reservations感興趣,因此就去了那里。
$ curl -iv https://rentals.jcg.com/reservations{"_embedded": {"reservations": [ {"id": "ce5886acbb87","vehicle": "Volkswagen Golf 1.2 TSI","from": "2020-02-01","to": "2020-02-12","_links": {"customer": {"href": "https://rentals.jcg.com/customers/fed195a03e9d"},"self": {"href": "https://rentals.jcg.com/reservations/ce5886acbb87"}},"_templates": {"default": {"method": "put","properties": [ {"name": "from","regex" : "yyyy-MM-dd","required": true}, {"name": "to","regex" : "yyyy-MM-dd","required": true}, {"name": "vehicle","required": true} ]},"delete": {"method": "delete","properties": [ ]}}}, ...]},"_links": {"self": {"href": "https://rentals.jcg.com/reservations"}},"_templates": {"default": {"method": "post","properties": [ {"name": "from","regex" : "yyyy-MM-dd","required": true}, {"name": "to","regex" : "yyyy-MM-dd","required": true}, {"name": "vehicle","required": true} ]}} }這次服務器返回強大的資源表示形式(為簡單起見,集合中僅保留一個保留項),其中包含許多超媒體元素,因此客戶端有多種選擇。
例如,通過檢查_templates 超媒體元素,它發現它可以通過在有效負載中提交包含from , to和vehicle屬性的HTTP POST請求來創建新的保留(因為它是HAL-FORMS ,所以使用application/x-www-form-urlencoded表單編碼)。 您可能會注意到,盡管存在一些約束,但沒有任何跡象表明from , to或vehicle屬性的類型(字符串?日期?數字?)是什么。
"_templates": {"default": {"method": "post","properties": [ {"name": "from","regex" : "yyyy-MM-dd","required": true}, {"name": "to","regex" : "yyyy-MM-dd","required": true}, {"name": "vehicle","required": true} ]} }備選地,客戶端可以通過自省相關聯的_templates 超媒體元素來表達對特定保留的興趣。
"_templates": {"default": {"method": "put","properties": [ {"name": "from","regex" : "yyyy-MM-dd","required": true}, {"name": "to","regex" : "yyyy-MM-dd","required": true}, {"name": "vehicle","required": true} ]},"delete": {"method": "delete","properties": [ ]} }在這種情況下,服務器提供選擇來使用HTTP PUT請求(完全替換語義)來更新保留,或者使用HTTP DELETE請求來完全刪除特定的保留。
超媒體–結論
在本教程的這一部分中,我們討論了超媒體和HATEOAS ,這是任何RESTful Web服務或API的組成部分。 超媒體規范的前景并非一成不變,并且在不斷變化。 我們進行了很多選擇,但沒有遇到明顯的贏家。 這樣做的原因是,每一個都有不同的權衡,您需要確定哪種超媒體規范最適合您的應用程序需求。 上下文很重要,因此請認真對待。 您可能會發現有關為API選擇超媒體類型的文章-HAL,JSON-LD,Collection + JSON,SIREN,噢,我的天哪! 由Kevin Sookocheff提供幫助。
7.接下來
在本教程的下一部分中,我們將討論文檔在由hypermedia支持的RESTful Web服務和API的生命周期中的作用。
翻譯自: https://www.javacodegeeks.com/restful-services-with-hateoas-hypermedia-the-secret-ingredient-of-rest.html
restful rest
總結
以上是生活随笔為你收集整理的restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: micrometer_具有InlfuxD
- 下一篇: 老旧电脑显示器图片(老式电脑显示屏图片)