簡介
我們知道REST是一種架構方式,它只是指定了六種需要遵循的基本原則,但是它指定的原則都比較寬泛,我們需要一種更加具象的約束條件來指導我們的編碼。這就是HATEOAS。
HATEOAS簡介
REST的英文全稱是REpresentational State Transfer,表示的是狀態的轉移。而HATEOAS的全稱是Hypertext As The Engine Of Application State,表示使用超文本作為應用程序的狀態。這樣兩者就關聯起來了。HATEOAS指定了狀態的表現形式。
超文本就是鏈接,在HATEOAS的規則下,所有的資源請求都是需要帶上鏈接的,這些鏈接表示可以對該資源進行的下一步操作。並且,這些鏈接是動態變化的,根據請求資源的不同而不同。所以,如果你的架構實現了HATEOAS風格的話,可以繼續減少client和server端的接口依賴關系。因為所有可以進行的操作都已經放在返回資源的超鏈接中了。
我們舉個例子,還是請求students的例子,假如我們請求:
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本身的信息和相關的links信息,里面含有Student的school信息。客戶端可以通過返回的links繼續向下獲取更多的信息。
如果我們訪問另外一個student,看下返回結果有什么不同:
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",
}
}
}
看到有什么不同了嗎? 這次學生的age=20 ,所以擁有的選舉的權限,這次在我們的links里面多了一個vote鏈接。
links會根據資源的不同發送變化,客戶端不需要知道任何服務器端的邏輯,每個請求都包含了所有可以繼續執行的操作,從而讓客戶端和服務器端徹底解耦。
在現實世界中,當您訪問一個網站時,您會點擊它的主頁。它提供了一些快照和網站其他部分的鏈接。您單擊它們,然后您將獲得更多信息以及與上下文相關的更多相關鏈接。
類似於人與網站的交互,REST客戶端訪問初始API URI並使用服務器提供的鏈接動態發現可用操作並訪問所需的資源。客戶不需要事先了解服務或工作流中涉及的不同步驟。此外,客戶端不再需要對各種資源的URI結構進行硬編碼。 HATEOAS允許服務器在不中斷客戶端的情況下隨着API的發展進行URI更改。
HATEOAS的格式
HATEOAS有兩個比較重要的格式,分別是RFC 5988 (web linking) 和 JSON Hypermedia API Language (HAL)。
他們稍有不同,但是原理是大同小異的。感興趣的朋友可以自行查閱。
HATEOAS的Spring支持
人民需要什么,Spring就造什么。同樣的,對於REST+HATEOAS這種優美組合,怎么能夠少得了Spring的身影呢?
Spring推出了Spring HATEOAS來實現這一功能。最新的版本是1.3.0,如果你使用的Spring boot,那么使用起來將會更加的簡單,引用下面的XML就可以了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
<version>2.5.1</version>
</dependency>
如果是非Spring boot環境,則可以這樣引用:
<dependency>
<groupId>org.springframework.hateoas</groupId>
<artifactId>spring-hateoas</artifactId>
<version>1.3.1</version>
</dependency>
在Spring HATEOAS中提供了一系列非常有用的特征來幫助我們創建Link,從而減輕我們的工作。有關Spring HATEOAS的具體內容,我們會在后面的文章中詳細講解。
總結
如果你使用的REST架構,那么配合上HATEOAS規則應該就是最好的組合。祝你成功。
本文已收錄於 http://www.flydean.com/03-rest-hateoas/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!