架构之:REST和HATEOAS
文章目錄
- 簡介
- HATEOAS簡介
- HATEOAS的格式
- HATEOAS的Spring支持
- 總結(jié)
簡介
我們知道REST是一種架構(gòu)方式,它只是指定了六種需要遵循的基本原則,但是它指定的原則都比較寬泛,我們需要一種更加具象的約束條件來指導(dǎo)我們的編碼。這就是HATEOAS。
HATEOAS簡介
REST的英文全稱是REpresentational State Transfer,表示的是狀態(tài)的轉(zhuǎn)移。而HATEOAS的全稱是Hypertext As The Engine Of Application State,表示使用超文本作為應(yīng)用程序的狀態(tài)。這樣兩者就關(guān)聯(lián)起來了。HATEOAS指定了狀態(tài)的表現(xiàn)形式。
超文本就是鏈接,在HATEOAS的規(guī)則下,所有的資源請(qǐng)求都是需要帶上鏈接的,這些鏈接表示可以對(duì)該資源進(jìn)行的下一步操作。并且,這些鏈接是動(dòng)態(tài)變化的,根據(jù)請(qǐng)求資源的不同而不同。所以,如果你的架構(gòu)實(shí)現(xiàn)了HATEOAS風(fēng)格的話,可以繼續(xù)減少client和server端的接口依賴關(guān)系。因?yàn)樗锌梢赃M(jìn)行的操作都已經(jīng)放在返回資源的超鏈接中了。
我們舉個(gè)例子,還是請(qǐng)求students的例子,假如我們請(qǐng)求:
GET /students/zhangsan HTTP/1.1 Host: api.rest.com Accept: application/json那么返回的json可能是下面這樣子的:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: ...{"student": {"student_id": 11111,"age": 10,"links": {"school": "/student/11111/school"}} }可以看到返回的信息包含student本身的信息和相關(guān)的links信息,里面含有Student的school信息。客戶端可以通過返回的links繼續(xù)向下獲取更多的信息。
如果我們?cè)L問另外一個(gè)student,看下返回結(jié)果有什么不同:
GET /students/lisi HTTP/1.1 Host: api.rest.com Accept: application/json那么返回的json可能是下面這樣子的:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: ...{"student": {"student_id": 2222,"age": 20,"links": {"school": "/student/2222/school","vote": "/student/2222/vote",}} }看到有什么不同了嗎? 這次學(xué)生的age=20 ,所以擁有的選舉的權(quán)限,這次在我們的links里面多了一個(gè)vote鏈接。
links會(huì)根據(jù)資源的不同發(fā)送變化,客戶端不需要知道任何服務(wù)器端的邏輯,每個(gè)請(qǐng)求都包含了所有可以繼續(xù)執(zhí)行的操作,從而讓客戶端和服務(wù)器端徹底解耦。
在現(xiàn)實(shí)世界中,當(dāng)您訪問一個(gè)網(wǎng)站時(shí),您會(huì)點(diǎn)擊它的主頁。它提供了一些快照和網(wǎng)站其他部分的鏈接。您單擊它們,然后您將獲得更多信息以及與上下文相關(guān)的更多相關(guān)鏈接。
類似于人與網(wǎng)站的交互,REST客戶端訪問初始API URI并使用服務(wù)器提供的鏈接動(dòng)態(tài)發(fā)現(xiàn)可用操作并訪問所需的資源。客戶不需要事先了解服務(wù)或工作流中涉及的不同步驟。此外,客戶端不再需要對(duì)各種資源的URI結(jié)構(gòu)進(jìn)行硬編碼。 HATEOAS允許服務(wù)器在不中斷客戶端的情況下隨著API的發(fā)展進(jìn)行URI更改。
HATEOAS的格式
HATEOAS有兩個(gè)比較重要的格式,分別是RFC 5988 (web linking) 和 JSON Hypermedia API Language (HAL)。
他們稍有不同,但是原理是大同小異的。感興趣的朋友可以自行查閱。
HATEOAS的Spring支持
人民需要什么,Spring就造什么。同樣的,對(duì)于REST+HATEOAS這種優(yōu)美組合,怎么能夠少得了Spring的身影呢?
Spring推出了Spring HATEOAS來實(shí)現(xiàn)這一功能。最新的版本是1.3.0,如果你使用的Spring boot,那么使用起來將會(huì)更加的簡單,引用下面的XML就可以了:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-hateoas</artifactId><version>2.5.1</version> </dependency>如果是非Spring boot環(huán)境,則可以這樣引用:
<dependency><groupId>org.springframework.hateoas</groupId><artifactId>spring-hateoas</artifactId><version>1.3.1</version> </dependency>在Spring HATEOAS中提供了一系列非常有用的特征來幫助我們創(chuàng)建Link,從而減輕我們的工作。有關(guān)Spring HATEOAS的具體內(nèi)容,我們會(huì)在后面的文章中詳細(xì)講解。
總結(jié)
如果你使用的REST架構(gòu),那么配合上HATEOAS規(guī)則應(yīng)該就是最好的組合。祝你成功。
本文已收錄于 http://www.flydean.com/03-rest-hateoas/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的架构之:REST和HATEOAS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 密码学系列之:Merkle–Damgår
- 下一篇: 小师妹学IO系列文章集合-附PDF下载