架構之:REST和HATEOAS

flydean 發表於 2021-07-26

簡介

我們知道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/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!