Introduction of RESTful level & HATEOAS

一、什麼是RESTful?

REST這個詞,是Roy Thomas Fielding在他2000年的博士論文中提出的。翻譯過來就是"表現層狀態轉化。」php

Roy Thomas Fielding在論文中將REST定位爲「分佈式超媒體應用(Distributed Hypermedia System)」的架構風格,它在文中提到一個名爲「HATEOAS(Hypermedia as the engine of application state)」的概念。
若是一個架構符合REST原則,就稱它爲RESTful架構html

REST level服務器

  1. 0級
    傳統的RPC,基於SOAP的WS,調用的服務名,參數放在HTTP協議的body裏面,同時必須以POST方式提交,問題在於你必須清楚的知道全部服務,子服務,及其參數的信息,而且須要知道各類服務的不一樣點
  2. 1級
    利用resource概念,把全部服務都抽取成resource概念,從body中提取到header裏,這樣作的好處就是若是你知道一個服務地址,你可能無需知道具體服務是什麼,依照資源的慣例就訪問到服務,好比/books/1
  3. 2級
    利用HTTP動詞,HTTP定義了4種動詞,GET獲取服務器資源,POST在服務器上建立新資源,PUT更改服務器上資源,DELETE刪除服務器上資源,任何操做均可以當作增刪改查,因此利用標準的http verb加上resource(/book/1)就能準確地操做資源,當你不知道服務具體是什麼的時候也能夠輕易按照慣例訪問到服務,然而服務供應商更改服務也須要遵循慣例,不會像RPC那樣輕易更改服務接口。
  4. 3級
    最高級別,超媒體既應用狀態引擎。這個意思是說,對於任何服務都存在不少子服務,你只須要知道第一個服務的入口,即可以依據服務返回結構的自描述性獲得下一個服務的入口,這樣在服務供應商修改服務的時候,不會影響到客戶端的調用。

理解RESTful架構restful

  • 資源
    REST的名稱"表現層狀態轉化"中,省略了主語。"表現層"其實指的是"資源"(Resources)的"表現層"。
    所謂"資源",就是網絡上的一個實體,或者說是網絡上的一個具體信息
  • 表現層
    "資源"是一種信息實體,它能夠有多種外在表現形式。咱們把"資源"具體呈現出來的形式,叫作它的"表現層"(Representation)。
  • 狀態轉換
    訪問一個網站,就表明了客戶端和服務器的一個互動過程。在這個過程當中,勢必涉及到數據和狀態的變化。
    互聯網通訊協議HTTP協議,是一個無狀態協議。這意味着,全部的狀態都保存在服務器端。所以,若是客戶端想要操做服務器,必須經過某種手段,讓服務器端發生"狀態轉化"(State Transfer)。而這種轉化是創建在表現層之上的,因此就是"表現層狀態轉化"。
    客戶端用到的手段,只能是HTTP協議。具體來講,就是HTTP協議裏面,四個表示操做方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操做:GET用來獲取資源,POST用來新建資源(也能夠用於更新資源),PUT用來更新資源,DELETE用來刪除資源。

綜上所述網絡

RESTful架構能夠總結成如下3點
一、每一個URL表明一種資源
二、客戶端和服務器之間,傳遞這種資源的某種表現層;
三、客戶端經過四個HTTP動詞,對服務器端資源進行操做,實現"表現層狀態轉化"架構

二、HATEOAS

超媒體做爲應用程序狀態引擎(HATEOAS)是REST應用程序體系結構的一個組件,它將其與其餘網絡應用程序體系結構區分開來。
使用HATEOAS,客戶端與網絡應用程序交互,其應用程序服務器經過超媒體動態提供信息。除了對超媒體的通常理解以外,REST客戶端幾乎不須要知道如何與應用程序或服務器交互。
HATEOAS約束將客戶端和服務器分離的方式使服務器功能可以獨立發展。app

示列分佈式

REST客戶端經過簡單的固定URL進入REST應用程序。客戶端可能採起的全部將來操做都在服務器返回的資源表示中發現。用於這些表示的媒體類型以及它們可能包含的連接關係是標準化的。客戶端經過從表示中的連接中進行選擇或經過以其媒體類型提供的其餘方式操縱表示來轉換應用程序狀態。經過這種方式,RESTful交互由超媒體驅動,而不是帶外信息。
列如以GET請求獲取帳戶資源,以XML表現形式請求詳細信息:網站

GET /accounts/12345 HTTP/1.1
Host: bank.example.com
Accept: application/xml
...

響應是:spa

HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...

<?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">100.00</balance> <link rel="deposit" href="https://bank.example.com/accounts/12345/deposit" /> <link rel="withdraw" href="https://bank.example.com/accounts/12345/withdraw" /> <link rel="transfer" href="https://bank.example.com/accounts/12345/transfer" /> <link rel="close" href="https://bank.example.com/accounts/12345/status" /> </account>

響應包含如下可能的後續連接:進行存款,取款或轉帳,或關閉帳戶。
稍後檢索賬戶信息時,賬戶會透支:

HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: ...

<?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">-25.00</balance> <link rel="deposit" href="https://bank.example.com/accounts/12345/deposit" /> </account>

如今只有一個連接可用:存入更多錢。在當前狀態下,其餘連接不可用。所以,術語引擎應用狀態。可能的操做因資源狀態的不一樣而有所不一樣。
客戶端不須要了解服務器提供的每種媒體類型和通訊機制。經過服務器提供給客戶端的「 按需代碼 」,能夠在運行時獲取理解新媒體類型的能力

參考連接:

https://en.wikipedia.org/wiki/HATEOAS

http://www.ruanyifeng.com/blog/2011/09/restful.html

https://elf8848.iteye.com/blog/379125

相關文章
相關標籤/搜索