日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HATEOAS的RESTful服务。 超媒体:REST的秘密要素

發(fā)布時(shí)間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HATEOAS的RESTful服务。 超媒体:REST的秘密要素 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在這篇文章中,我們將介紹有關(guān)HATEOAS的RESTful服務(wù)的綜合文章。 超媒體是REST的秘密成分。

1.簡介

在本教程的前一部分中,我們花了一些時(shí)間來刷新有關(guān)REST體系結(jié)構(gòu)樣式的基本原理的知識(shí)。 業(yè)界對(duì)REST狀態(tài)的批判性眼光揭示了一個(gè)令人失望的事實(shí),即它經(jīng)常被完全忽略,它的關(guān)鍵約束之一,即作為應(yīng)用程序狀態(tài)引擎( HATEOAS )的超媒體 。

目錄

1.簡介 2.這些“噪音”是什么? 3.野外的HATEOAS
3.1。 RFC 5988(網(wǎng)絡(luò)鏈接) 3.2。 哈爾 3.3。 JSON:API 3.4。 JSON-LD 3.5。 警笛 3.6。 集合+ JSON 3.7。 優(yōu)步 3.8。 亞哈皮 3.9。 石匠 3.10。 離子
4. HATEOAS的成本 5.案例研究 6。結(jié)論 7.接下來

超媒體由嵌入在信息表示中或作為信息表示之上的應(yīng)用程序控制信息的存在來定義。 分布式超媒體允許將表示和控制信息存儲(chǔ)在遠(yuǎn)程位置。

https://www.ics.uci.edu/~fielding/pubs/dissertation/web_arch_domain.htm#sec_4_1_3

這部分的主題是超媒體 ,尤其是HATEOAS 。 希望我們不僅可以確信它的重要性,而且可以支持許多策略,以利用超媒體功能豐富我們的REST Web服務(wù)和API。

2.這些“噪音”是什么?

眾所周知,無狀態(tài)是REST體系結(jié)構(gòu)風(fēng)格的強(qiáng)制性約束之一。 另一方面,絕大多數(shù)現(xiàn)實(shí)世界的Web服務(wù)和API必須處理狀態(tài)管理。 看起來REST忽略了現(xiàn)代軟件系統(tǒng)的現(xiàn)實(shí)和需求嗎?

絕對(duì)不是, REST體系結(jié)構(gòu)風(fēng)格承認(rèn)狀態(tài)管理的重要性,并以超媒體 (應(yīng)用程序狀態(tài)引擎)的形式提出了解決方案。 在服務(wù)器端, 超媒體的使用不僅通告資源之間的關(guān)系,而且通告可能潛在地應(yīng)用于該資源的動(dòng)作。 在客戶端, 超媒體的存在帶來了可發(fā)現(xiàn)性方面的下一步行動(dòng),步驟或要進(jìn)行的狀態(tài)轉(zhuǎn)換。 理想情況下,客戶端只需要知道一個(gè)URI入口點(diǎn),其他所有內(nèi)容都可以通過hypermedia來自服務(wù)器。

顯然,客戶端必須足夠聰明,才能以可行的方式瀏覽超媒體控件。 正如許多經(jīng)驗(yàn)豐富的Web服務(wù)和API開發(fā)人員已經(jīng)注意到的那樣,服務(wù)器上的超媒體支持并不是那么困難,而客戶端則要困難得多。

但是,在Web服務(wù)和API的上下文中, 超媒體到底是什么? 我們可以將其視為服務(wù)器隨響應(yīng)發(fā)送給客戶端的附加元信息。 它主要包括相關(guān)資源的鏈接,最重要的是,適用于所討論資源以更改其狀態(tài)的上下文操作。

當(dāng)我說超文本時(shí),我的意思是信息和控件的同時(shí)呈現(xiàn),從而使信息成為用戶通過其獲得選擇和選擇動(dòng)作的能力。 超媒體只是文本在媒體流中包含時(shí)間錨點(diǎn)的擴(kuò)展。 大多數(shù)研究人員已經(jīng)放棄了區(qū)分。

https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven#comment-718

總之,這些元數(shù)據(jù)片段告訴客戶端在哪里獲取更多數(shù)據(jù)或在當(dāng)前上下文中哪種操作有效。 如果您覺得這很刺激,那確實(shí)是。

因此,我們討論了什么是超媒體以及它在REST體系結(jié)構(gòu)風(fēng)格中的重要地位,現(xiàn)在該是我們討論超媒體的“方式”的時(shí)候了。

3.野外的HATEOAS

僅重申我們?cè)谏弦徊糠种兴f的內(nèi)容, REST體系結(jié)構(gòu)樣式要求使用超媒體 ,但未指定如何使用它。 顯然,這個(gè)漏洞必須關(guān)閉,并且多年來導(dǎo)致了各種樣式和規(guī)格的泛濫。 許多公司走得更遠(yuǎn),提出了自己的超媒體類型,藍(lán)圖和建議。

超媒體類型是MIME媒體類型,其中包含導(dǎo)致應(yīng)用程序流的本機(jī)超鏈接語義。 例如,HTML是一種超媒體類型。 XML不是。

http://amundsen.com/hypermedia/

令人驚訝的是,到目前為止,還沒有一個(gè)普遍接受的標(biāo)準(zhǔn)可以遵循,以使用超媒體元素來授權(quán)Web服務(wù)和API。 一些或多或少被廣泛采用,而另一些則占據(jù)相當(dāng)狹窄的位置。 而且,大多數(shù)規(guī)范仍在發(fā)展之中,并且在進(jìn)行中時(shí)被廣告宣傳。

為什么會(huì)有這么多規(guī)格,主要區(qū)別是什么? 總的來說,罪惡源于細(xì)節(jié),更具體地說,是描述相關(guān)資源,鏈接和動(dòng)作/操作。 如何找到最適合您的? 坦白地說,選擇合適的規(guī)范會(huì)直接影響支持該規(guī)范所需的工作量。 如果是未開發(fā)的Web服務(wù)或API,您幾乎可以自由選擇。 相比之下,當(dāng)您維護(hù)現(xiàn)有的Web服務(wù)或API并通過超媒體支持對(duì)其進(jìn)行豐富的任務(wù)時(shí),選擇突然變得非常有限(除非您擁有完全重寫的特權(quán))。

從實(shí)現(xiàn)的角度來看,大多數(shù)規(guī)范都傾向于使用JSON格式來表示資源狀態(tài)和超媒體控件。 但是,有些異常值會(huì)改用HTTP協(xié)議標(biāo)頭。 這當(dāng)然不是REST架構(gòu)風(fēng)格所決定的,而是來自現(xiàn)代Web服務(wù)和API的現(xiàn)實(shí),它們都是面向HTTP的。

因此,這些規(guī)格是什么?

RFC 5988(網(wǎng)絡(luò)鏈接)

我們將從RFC-5988:Web鏈接開始 。 它為Web鏈接指定關(guān)系類型,為它們定義注冊(cè)表,還定義HTTP頭中帶有特殊Link頭的此類鏈接的使用。 這是一個(gè)簡單的示例:

Link: <https://rentals.jcg.com/reservations>; rel="self"; title="reservations"

可以肯定的是, Link頭(或多個(gè)Link頭)中編碼的Link可能不止一個(gè),例如:

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鏈接是引入超媒體支持的最基本,最簡單的方法。 不管是使用新的還是現(xiàn)有的API,都可以很容易地將其接受,但是從功能角度來看, Web鏈接提供的選項(xiàng)集非常有限,主要是簡單的關(guān)系,并且不支持動(dòng)作和集合 。

哈爾

JSON超媒體API語言或HAL建立使用JSON表示超媒體控件(鏈接和資源)的約定。 它由Mike Kelly于2011年創(chuàng)建。Web服務(wù)和API發(fā)出HAL文檔,以便客戶端可以提取適當(dāng)?shù)逆溄?#xff0c;并根據(jù)它們的關(guān)系類型在它們之間進(jìn)行導(dǎo)航。

盡管HAL規(guī)范仍處于起草階段 ,但其設(shè)計(jì)原理使其成為了由超媒體驅(qū)動(dòng)的現(xiàn)代Web服務(wù)和API的最佳選擇之一。

HAL的主要設(shè)計(jì)目標(biāo)是通用性和簡單性。 HAL可以應(yīng)用于許多不同的域,并施加了滿足超媒體API關(guān)鍵要求所需的最少結(jié)構(gòu)量。

https://tools.ietf.org/id/draft-kelly-json-hal-02.html

您可能會(huì)猜到,資源表示形式是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模板和鏈接關(guān)系文檔。 不幸的是, HAL不提供任何行動(dòng)支持(您可能聽說過的另一個(gè)名字是Provided )。 試圖填補(bǔ)HAL空白的衍生規(guī)范之一是HAL-FORMS 。 從本質(zhì)上講,它只是HAL的擴(kuò)展,通過表達(dá)方法和屬性的能力來增強(qiáng)它。

{ "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": [ ] } } }

請(qǐng)注意, HAL-FORMS旨在僅顯示針對(duì)同一資源(或URI)可用的操作。 如果是JSON表示形式,則會(huì)為HAL-FORMS分配專用的媒體類型application/prs.hal-forms+json 。

JSON:API

JSON:API是受超媒體支持的Web服務(wù)和API的最廣泛支持的標(biāo)準(zhǔn)之一。 它最初是由Yehuda Katz于2013年起草的,此后越來越受歡迎。 您可能會(huì)猜到,它僅適用于JSON表示形式。

JSON:API旨在最大程度地減少請(qǐng)求數(shù)量和客戶端與服務(wù)器之間傳輸?shù)臄?shù)據(jù)量。 在不影響可讀性,靈活性或可發(fā)現(xiàn)性的情況下實(shí)現(xiàn)了這種效率。

https://jsonapi.org/format/

JSON:API規(guī)范描述了鏈接,資源關(guān)系和資源修改(相當(dāng)于動(dòng)作)的語義。 另外,它涵蓋了表示錯(cuò)誤的方式。

{ "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脫穎而出的原因是,考慮了諸如排序,過濾,稀疏字段集和分頁之類的獲取(查詢)模式,這些模式也是規(guī)范的一部分。

{"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具有非常簡單,可讀和可理解的格式。 為了實(shí)現(xiàn)這種折衷,它做出了一些明智的決定。 例如,您不會(huì)直接在JSON:API文檔中看到操作。 實(shí)際上,它們根據(jù)HTTP協(xié)議是隱式和隱式的: POST用于創(chuàng)建, PATCH用于修改, DELETE用于刪除。 這可能給客戶帶來一些解釋上的困難,例如, PUT在哪里 ?

盡管JSON:API規(guī)范的1.0版在2015年開始亮相,但它正在積極地研究之中,并被認(rèn)為是一個(gè)不斷發(fā)展的文檔。 JSON:API已正確注冊(cè)了媒體類型名稱application/vnd.api+json并且還擁有自己的JSON模式 定義 。

JSON-LD

JSON-LD是鏈接數(shù)據(jù)的基于JSON的序列化,在2014年就獲得了W3C候選正式建議的地位。它可能是最活躍的社區(qū),而該規(guī)范的最新版本JSON-LD 1.1的字面意思是已發(fā)布。一個(gè)月前。 JSON-LD設(shè)計(jì)背后的關(guān)鍵原則強(qiáng)調(diào)能夠輕松集成到已經(jīng)使用JSON的現(xiàn)有系統(tǒng)中,并使用JSON-LD語義對(duì)其進(jìn)行擴(kuò)充,而不會(huì)破壞已建立的聯(lián)系。

可以肯定地說, JSON-LD與鏈接數(shù)據(jù)有關(guān)的不是超媒體,而是其表達(dá)信息,上下文和關(guān)系的豐富功能非常適合某些超媒體承諾。

{ "@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的缺點(diǎn)之一是它缺乏對(duì)動(dòng)作的支持。 Hydra解決了JSON-LD的主要缺點(diǎn), Hydra是超媒體驅(qū)動(dòng)的Web服務(wù)和API的詞匯。

Hydra的基本思想是提供一個(gè)詞匯表,該詞匯表可使服務(wù)器將有效的狀態(tài)轉(zhuǎn)換通告給客戶端。 然后,客戶端可以使用此信息來構(gòu)造HTTP請(qǐng)求,該請(qǐng)求將修改服務(wù)器的狀態(tài),從而實(shí)現(xiàn)某個(gè)所需的目標(biāo)。

http://www.hydra-cg.com/spec/latest/core/#hydra-at-a-glance

為了了解它是如何工作的,讓我們看一下使用Hydra語義豐富的JSON-LD文檔的快速示例。

{"@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的最強(qiáng)之處是數(shù)據(jù)鏈接。 與Hydra結(jié)合使用,您的Web服務(wù)和API將獲得成熟的超媒體功能,但是集成可能并不像人們期望的那么容易。 JSON-LD具有保留的媒體application/ld+json 。

警笛

Siren由Kevin Swiber于2012年撰寫,是用于表示實(shí)體的超媒體規(guī)范。 Siren詞匯表中的實(shí)體是URI可尋址資源,具有與之關(guān)聯(lián)的屬性,操作和可導(dǎo)航鏈接。 值得注意的是, Siren是專門為Web服務(wù)和API設(shè)計(jì)的,例如,動(dòng)作可以直接映射到HTTP協(xié)議動(dòng)詞。

{ "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" } ] }

盡管年代久遠(yuǎn), Siren仍被列為進(jìn)行中的作品。 它本身不像HAL或JSON:API那樣流行,但是它相對(duì)簡單和Web API優(yōu)先語義使其成為值得考慮的選項(xiàng)。 Siren JSON表示形式的媒體類型為application/vnd.siren+json 。

集合+ JSON

由Mike Amundsen在2011年創(chuàng)建的Collection + JSON規(guī)范旨在成為一種超媒體類型,旨在支持讀取,編寫和查詢簡單集合。 它在某種程度上受到Atom聯(lián)合格式(RFC-4287)和Atom發(fā)布協(xié)議(RFC-5023)的啟發(fā)。 關(guān)于Collection + JSON的一個(gè)有趣事實(shí)是,它將所有內(nèi)容都視為一個(gè)集合,因此,單個(gè)項(xiàng)目表示為一個(gè)元素的集合。

{"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": ""} ]}} }

您可能會(huì)猜到, Collection + JSON標(biāo)準(zhǔn)非常適合列表和集合。 它還包括對(duì)查詢模板 (鏈接和關(guān)系)和寫模板 (操作)的支持,以及標(biāo)準(zhǔn)化的錯(cuò)誤報(bào)告。

在某些時(shí)候, Collection + JSON非常流行,但是與其他替代方案相比,它實(shí)現(xiàn)起來可能更困難。 同樣,對(duì)“萬物都是收藏”的偏見是不直觀的。

Collection + JSON的媒體類型為application/vnd.collection+json 。

優(yōu)步

UBER 超媒體類型描述了對(duì)簡單狀態(tài)轉(zhuǎn)移和臨時(shí)轉(zhuǎn)移的支持。 它是由Mike Amundsen (是Collection + JSON的作者)和Irakli Nadareishvili于2014年左右共同創(chuàng)建的,同時(shí)針對(duì)XML和JSON變體。

那么,作者提出另一種超媒體類型的動(dòng)機(jī)是什么? 邁克·阿蒙森 ( Mike Amundsen)的這則推文使推理過程更加清晰。

Collection + JSON是高度結(jié)構(gòu)化的CRUD格式。 HAL適用于內(nèi)聯(lián)超媒體, Siren具有豐富的obj模型。 UBER開放且極簡。

https://twitter.com/mamund/status/456508872832716800

UBER文檔支持鏈接關(guān)系,操作和錯(cuò)誤報(bào)告機(jī)制。 該規(guī)范旨在與多種協(xié)議一起使用,但包括有關(guān)基于HTTP的實(shí)現(xiàn)和解釋的詳細(xì)指南。

{"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年以來,它仍被標(biāo)記為草稿(準(zhǔn)確地說是穩(wěn)定的草稿),并且沒有太大變化。它沒有正式注冊(cè)的媒體類型,因此,如果使用JSON表示,則必須使用application/vnd.amundsen-uber+json 。

亞哈皮

有許多鮮為人知的超媒體規(guī)范值得關(guān)注。 我們將從 2014年首次發(fā)布的Another Hypermedia(ish)API規(guī)范( Yahapi )開始,該規(guī)范本質(zhì)上是啟用 超媒體的約定的列表。

最后, Yahapi只是使您的API看起來漂亮,簡單且一致的首選項(xiàng)列表。

https://github.com/Yahapi/yahapi

Yahapi提供了分頁,排序,部分結(jié)果和錯(cuò)誤格式的準(zhǔn)則列表,支持鏈接和關(guān)系,但不幸的是不支持操作。 它很少在野外發(fā)現(xiàn)并且不是真正活躍。 Yahapi文檔的媒體類型僅為application/json 。

石匠

Mason是一種基于JSON的格式,用于將超媒體元素引入經(jīng)典的JSON數(shù)據(jù)表示中。 特別是,它包括用于鏈接和動(dòng)作的超媒體元素以及標(biāo)準(zhǔn)化的錯(cuò)誤處理。 Mason在媒體類型注冊(cè)表中注冊(cè)為application/vnd.mason+json 。

離子

Ion將自身定位為REST的一種基于JSON的直觀超媒體類型。 它涵蓋了關(guān)系類型的鏈接以及使用表單的操作 。 不幸的是,自2018年以來,該規(guī)范似乎處于休眠狀態(tài)。分配給Ion內(nèi)容的媒體類型為application/ion+json 。

4. HATEOAS的成本

此時(shí),您應(yīng)該對(duì)將超媒體和HATEOAS應(yīng)用于RESTful Web服務(wù)和API時(shí)的作用有一個(gè)很好的了解。 而且,如果您是從事典型企業(yè)項(xiàng)目的經(jīng)驗(yàn)豐富的軟件開發(fā)人員,您可能很難記得上一次遇到HATEOAS時(shí)的情況。 讓我們面對(duì)現(xiàn)實(shí):沒有人知道如何使用超媒體 。

在REST體系結(jié)構(gòu)的上下文中, HATEOAS是必須的,但它不是免費(fèi)的,并且會(huì)產(chǎn)生成本,有時(shí)非常重要。 不僅在實(shí)施方面,而且在前期設(shè)計(jì)方面。 在這方面,服務(wù)器相對(duì)容易,但是客戶端確實(shí)很困難(充其量您可能會(huì)獲得Link標(biāo)頭的支持)。 實(shí)際上,這意味著即使您開發(fā)完美的RESTful Web服務(wù)或API,其他開發(fā)人員也有很大可能選擇完全不在其客戶端中使用超媒體。

在本教程的這一部分中,我們討論了許多不同的超媒體規(guī)范。 除少數(shù)例外,其中大多數(shù)帶有“進(jìn)行中”或“不穩(wěn)定”的標(biāo)簽。 總的來說,這意味著仍有黑暗的水域在航行,而您最終到達(dá)那里的機(jī)會(huì)很高。 這就是為什么要持續(xù)不斷地創(chuàng)建新規(guī)范的原因之一。 顯然,每個(gè)規(guī)范需要非常不同的設(shè)計(jì)和實(shí)現(xiàn)工作量。 希望您的編程語言或平臺(tái)生態(tài)系統(tǒng)已經(jīng)有了一些庫和框架來幫助您入門,但總的來說并非如此。

在服務(wù)器和客戶端之間的數(shù)據(jù)交換方面, 超媒體可能會(huì)導(dǎo)致更多往返,以獲取鏈接和關(guān)系背后的其他詳細(xì)信息。 由于需要包括鏈接和操作,這也可能導(dǎo)致資源表示的大小顯著增加。

您可能會(huì)問自己一個(gè)有趣的問題,即REST架構(gòu)風(fēng)格(尤其是HATEOAS)如何與微服務(wù)架構(gòu)融合? 為了說明問題,請(qǐng)考慮一個(gè)只有兩個(gè)微 Customer Service的系統(tǒng),即Customer Service和Reservation Service 。 由于客戶不需要任何額外的知識(shí)或前期知識(shí),他們?nèi)绾伟l(fā)現(xiàn)有多種服務(wù)? Reservation Service如何整合與客戶相關(guān)的超媒體元素,反之亦然? 很有可能由另一層(如API網(wǎng)關(guān)或/和聚合器)負(fù)責(zé) ,當(dāng)然這聽起來并不簡單。

如果此時(shí)您不懼怕超媒體和HATEOAS ,請(qǐng)不要擔(dān)心。 收益大大超過了所需的成本和精力,尤其是從長期來看。 作為對(duì)此的確認(rèn),讓我們看一下簡短而簡單的案例研究。

5.案例研究

我們將要分析的示例應(yīng)用程序是一個(gè)汽車租賃平臺(tái),該平臺(tái)目前僅實(shí)現(xiàn)兩個(gè)RESTful Web API來管理reservations和customers 。 與任何客戶端共享的唯一知識(shí)是平臺(tái)的入口點(diǎn),出于演示目的,假設(shè)在偽造的URL https://rentals.jcg.com后面有服務(wù)器。

該端點(diǎn)僅接受HTTP GET請(qǐng)求并返回超媒體文檔(使用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" } } }

一旦了解超媒體的客戶收到此類文檔,便可以清楚地了解到可以從那里導(dǎo)航到兩個(gè)鏈接: reservations和customers 。 在這種情況下,客戶對(duì)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} ]}} }

這次服務(wù)器返回強(qiáng)大的資源表示形式(為簡單起見,集合中僅保留一個(gè)保留項(xiàng)),其中包含許多超媒體元素,因此客戶端有多種選擇。

例如,通過檢查_templates 超媒體元素,它可以發(fā)現(xiàn)它可以通過提交HTTP POST請(qǐng)求來創(chuàng)建新的保留,該請(qǐng)求中包含有效載荷中的from , to和vehicle屬性(因?yàn)樗荋AL-FORMS ,請(qǐng)使用application/x-www-form-urlencoded表單編碼)。 您可能會(huì)注意到,盡管存在一些約束,但沒有任何跡象表明from , to或vehicle屬性的類型(字符串?日期?數(shù)字?)是什么。

"_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} ]} }

備選地,客戶端可以通過自省相關(guān)聯(lián)的_templates 超媒體元素來表達(dá)對(duì)特定保留的興趣。

"_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": [ ]} }

在這種情況下,服務(wù)器提供使用HTTP PUT請(qǐng)求(完全替換語義)更新保留或使用HTTP DELETE請(qǐng)求完全刪除特定保留的選擇。

超媒體–結(jié)論

在本教程的這一部分中,我們討論了超媒體和HATEOAS ,這是任何RESTful Web服務(wù)或API的組成部分。 超媒體規(guī)范的前景并非一成不變,并且在不斷變化。 我們進(jìn)行了很多選擇,但沒有遇到明顯的贏家。 這樣做的原因是,每一個(gè)都有不同的權(quán)衡,您需要確定哪種超媒體規(guī)范最適合您的應(yīng)用程序需求。 上下文很重要,因此請(qǐng)認(rèn)真對(duì)待。 您可能會(huì)發(fā)現(xiàn)有關(guān)為API選擇超媒體類型的文章-HAL,JSON-LD,Collection + JSON,SIREN,噢,我的天哪! 由Kevin Sookocheff提供的幫助很大。

7.接下來

在本教程的下一部分中,我們將討論文檔在由hypermedia支持的RESTful Web服務(wù)和API的生命周期中的作用。

翻譯自: https://www.javacodegeeks.com/restful-services-with-hateoas-hypermedia-the-secret-ingredient-of-rest.html

總結(jié)

以上是生活随笔為你收集整理的HATEOAS的RESTful服务。 超媒体:REST的秘密要素的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。