Restful levels&HATEOAS

  1. 什麼是RESTful
  • REST這個詞,是Roy Thomas Fielding在他2000年的博士論文中提出的。翻譯過來就是"表現層狀態轉化。」
  • REST是一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件能夠更簡潔,更有層次,更易於實現緩存等機制。而知足這些約束條件和原則的應用程序或設計就是 RESTful。

    2.REST的四個級別:數據庫

    0級:傳統的RPC,基於SOAP的WS,調用的服務名,參數放在HTTP協議的body裏面,同時必須以POST方式提交,問題在於你必須清楚的知道全部服務,子服務,及其參數的信息,而且須要知道各類服務的不一樣點。緩存

    1級:利用resource概念,把全部服務都抽取成resource概念,從body中提取到header裏,這樣作的好處就是若是你知道一個服務地址,你可能無需知道具體服務是什麼,依照資源的慣例就訪問到服務,好比/books/1。服務器

    2級:利用HTTP動詞,HTTP定義了4種動詞,GET獲取服務器資源,POST在服務器上建立新資源,PUT更改服務器上資源,DELETE刪除服務器上資源,任何操做均可以當作增刪改查,因此利用標準的http verb加上resource(/book/1)就能準確地操做資源,當你不知道服務具體是什麼的時候也能夠輕易按照慣例訪問到服務,然而服務供應商更改服務也須要遵循慣例,不會像RPC那樣輕易更改服務接口。restful

    3級:最高級別,超媒體既應用狀態引擎。這個意思是說,對於任何服務都存在不少子服務,你只須要知道第一個服務的入口,即可以依據服務返回結構的自描述性獲得下一個服務的入口,這樣在服務供應商修改服務的時候,不會影響到客戶端的調用。架構

    hateoas簡介
    HATEOAS是Hypertext As The Engine Of Application State的縮寫。在Richardson Maturity Model中, 它是REST的最高級形態。app

    在介紹 HATEOAS 以前,先介紹一下 Richardson 提出的 REST 成熟度模型。該模型把 REST 服務按照成熟度劃分紅 4 個層次:post

    第一個層次(Level 0)的 Web 服務只是使用 HTTP 做爲傳輸方式,實際上只是遠程方法調用(RPC)的一種具體形式。SOAP 和 XML-RPC 都屬於此類。
    第二個層次(Level 1)的 Web 服務引入了資源的概念。每一個資源有對應的標識符和表達。
    第三個層次(Level 2)的 Web 服務使用不一樣的 HTTP 方法來進行不一樣的操做,而且使用 HTTP 狀態碼來表示不一樣的結果。如 HTTP GET 方法來獲取資源,HTTP DELETE 方法來刪除資源。
    第四個層次(Level 3)的 Web 服務使用 HATEOAS。在資源的表達中包含了連接信息。客戶端能夠根據連接來發現能夠執行的動做。
    該模型將REST劃做了由低到高四個等級,等級越高,RESTful就越成熟。關於restful層次的網上也有不少例子,這裏就不贅述了。
    須要注意的是,熟透了東西不必定好,甚至可能爛了,因此,項目中對於RESTful層級的選擇要靈活把控,如今最經常使用的就是level2這個層次。翻譯

    關於level2中有個比較常出錯的地方,URI中不該該包含動詞。 由於"資源"表示一種實體,因此應該是名詞,URI不該該有動詞,動詞應該放在HTTP協議中。舉例來講,某個URI是/posts/show/1,其中show是動詞,這個URI就設計錯了,正確的寫法應該是/posts/1,而後用GET方法表示show。若是某些動做是HTTP動詞表示不了的,你就應該把動做作成一種資源。好比網上匯款,從帳戶1向帳戶2匯款500元,錯誤的URI是:POST /accounts/1/transfer/500/to/2,正確的寫法是把動詞transfer改爲名詞transaction,而後以參數的方式註明其它參數
    POST /accounts/transaction?from=1&to=2&amount=500.00
    RESTful API最好作到Hypermedia(HATEOAS),即返回結果中提供連接,連向其餘API方法,使得用戶不查文檔,也知道下一步應該作什麼。設計

    hateoas簡介
    HATEOAS是Hypertext As The Engine Of Application State的縮寫。在Richardson Maturity Model中, 它是REST的最高級形態。rest

    在介紹 HATEOAS 以前,先介紹一下 Richardson 提出的 REST 成熟度模型。該模型把 REST 服務按照成熟度劃分紅 4 個層次:

    第一個層次(Level 0)的 Web 服務只是使用 HTTP 做爲傳輸方式,實際上只是遠程方法調用(RPC)的一種具體形式。SOAP 和 XML-RPC 都屬於此類。
    第二個層次(Level 1)的 Web 服務引入了資源的概念。每一個資源有對應的標識符和表達。
    第三個層次(Level 2)的 Web 服務使用不一樣的 HTTP 方法來進行不一樣的操做,而且使用 HTTP 狀態碼來表示不一樣的結果。如 HTTP GET 方法來獲取資源,HTTP DELETE 方法來刪除資源。
    第四個層次(Level 3)的 Web 服務使用 HATEOAS。在資源的表達中包含了連接信息。客戶端能夠根據連接來發現能夠執行的動做。
    該模型將REST劃做了由低到高四個等級,等級越高,RESTful就越成熟。關於restful層次的網上也有不少例子,這裏就不贅述了。
    須要注意的是,熟透了東西不必定好,甚至可能爛了,因此,項目中對於RESTful層級的選擇要靈活把控,如今最經常使用的就是level2這個層次。

    關於level2中有個比較常出錯的地方,URI中不該該包含動詞。 由於"資源"表示一種實體,因此應該是名詞,URI不該該有動詞,動詞應該放在HTTP協議中。舉例來講,某個URI是/posts/show/1,其中show是動詞,這個URI就設計錯了,正確的寫法應該是/posts/1,而後用GET方法表示show。若是某些動做是HTTP動詞表示不了的,你就應該把動做作成一種資源。好比網上匯款,從帳戶1向帳戶2匯款500元,錯誤的URI是:POST /accounts/1/transfer/500/to/2,正確的寫法是把動詞transfer改爲名詞transaction,而後以參數的方式註明其它參數
    POST /accounts/transaction?from=1&to=2&amount=500.00
    RESTful API最好作到Hypermedia(HATEOAS),即返回結果中提供連接,連向其餘API方法,使得用戶不查文檔,也知道下一步應該作什麼。

    HATEOAS又是什麼鬼?
    咱們知道REST是使用標準的HTTP方法來操做資源的,但僅僅所以就理解成帶CURD的Web數據庫架構就太過於簡單了。 這種說法忽略了一個核心概念: 「超媒體即應用狀態引擎(hypermedia as the engine of application state)」。 超媒體是什麼? 當你瀏覽Web網頁時,從一個鏈接跳到一個頁面,再從另外一個鏈接跳到另一個頁面,就是利用了超媒體的概念: 把一個個把資源連接起來。
    要達到這個目的,就要求在表述格式裏邊加入連接來引導客戶端。在《RESTFul Web Services》一書中,做者把這種具備連接的特性成爲連通性。

    HATEOAS爲RESTful Web服務帶來了相同的概念。

    當請求資源的某些詳細信息時,您將提供資源詳細信息以及相關資源的詳細信息以及您能夠對資源執行的可能操做。例如,在請求有關facebook用戶的信息時,REST服務能夠返回如下內容

  • 用戶詳情
  • 獲取最近帖子的連接
  • 獲得他最近評論的連接
  • 檢索他朋友列表的連接 
相關文章
相關標籤/搜索