一、定義
REST全稱是Representational State Transfer, 中文意思是表述性狀態轉移。
REST指的是一組架構約束條件和原則,如果一個架構符合REST的約束條件和原則,我們就稱它為RESTful架構。
REST本身沒有創造新的技術、組件、或服務,而隱藏在RESTful背后的理念就是使用Web的現有特征和能力,更好地使用現有Web標准中的一些規則和約束。雖然REST本身受Web技術的影響很深,但是理論上REST架構風格並不是綁定在HTTP上,只不過目前HTTP是唯一與REST相關的實例。所以我們這里描述的REST也是通過HTTP實現的REST。
二、理解
要理解RESTful架構,需要理解Representational State Transfer這個詞組到底是什么意思,它的每一個詞都有些什么涵義。
下面我們結合REST原則,圍繞資源展開討論,從資源的定義、獲取、表述、關聯、狀態變遷等角度,列舉一些關鍵概念並加以解釋。
- 資源與URI
- 統一資源接口
- 資源的表述
- 資源的鏈接
- 狀態的轉移
1.資源與URI
REST全程是表述性狀態轉移,表述就是資源(指客戶端請求一個資源,服務器拿到的這個資源,就是表述)。資源可以是實體,也可以是一個抽象概念。
要讓一個資源被識別,需要有個唯一的標識,在Web中這個唯一標識就是URI(Uniform Resourse Identifier)。URI既可以堪稱是資源的地址,也可以看成是資源的名稱。如果某些信息沒有使用URI來表示,那它就不能算是一個資源,只能算資源的一些信息而已。URI的設計應該遵循 可尋址性原則,具有自描述性,需要在形式上給人以直覺上的關聯。
2.統一資源接口
RESTful架構應該遵循統一接口原則,統一接口包含了一組受限的預定義的操作,不論什么樣的資源,都是通過使用相同的接口進行資源的訪問。接口應該使用標准的HTTP方法如GET,PUT和POST,並遵循這些方法的語義。
如果按照HTTP方法的語義來暴露資源,那么接口將會擁有安全性和冪等性的特性,例如GET和HEAD請求都是安全的, 無論請求多少次,都不會改變服務器狀態。而GET、HEAD、PUT和DELETE請求都是冪等的,無論對資源操作多少次, 結果總是一樣的,后面的請求並不會產生比第一次更多的影響。
下面列出了GET,DELETE,PUT和POST的典型用法:
GET
- 安全且冪等
- 獲取表示
- 變更時獲取表示(緩存)
- 200(OK) - 表示已在響應中發出
- 204(無內容) - 資源有空表示
- 301(Moved Permanently) - 資源的URI已被更新
- 303(See Other) - 其他(如,負載均衡)
- 304(not modified)- 資源未更改(緩存)
- 400 (bad request)- 指代壞請求(如,參數錯誤)
- 404 (not found)- 資源不存在
- 406 (not acceptable)- 服務端不支持所需表示
- 500 (internal server error)- 通用錯誤響應
- 503 (Service Unavailable)- 服務端當前無法處理請求
POST
- 不安全且不冪等
- 使用服務端管理的(自動產生)的實例號創建資源
- 創建子資源
- 部分更新資源
- 如果沒有被修改,則不過更新資源(樂觀鎖)
- 200(OK)- 如果現有資源已被更改
- 201(created)- 如果新資源被創建
- 202(accepted)- 已接受處理請求但尚未完成(異步處理)
- 301(Moved Permanently)- 資源的URI被更新
- 303(See Other)- 其他(如,負載均衡)
- 400(bad request)- 指代壞請求
- 404 (not found)- 資源不存在
- 406 (not acceptable)- 服務端不支持所需表示
- 409 (conflict)- 通用沖突
- 412 (Precondition Failed)- 前置條件失敗(如執行條件更新時的沖突)
- 415 (unsupported media type)- 接受到的表示不受支持
- 500 (internal server error)- 通用錯誤響應
- 503 (Service Unavailable)- 服務當前無法處理請求
PUT
- 不安全但冪等
- 用客戶端管理的實例號創建一個資源
- 通過替換的方式更新資源
- 如果未被修改,則更新資源(樂觀鎖)
- 200 (OK)- 如果已存在資源被更改
- 201 (created)- 如果新資源被創建
- 301(Moved Permanently)- 資源的URI已更改
- 303 (See Other)- 其他(如,負載均衡)
- 400 (bad request)- 指代壞請求
- 404 (not found)- 資源不存在
- 406 (not acceptable)- 服務端不支持所需表示
- 409 (conflict)- 通用沖突
- 412 (Precondition Failed)- 前置條件失敗(如執行條件更新時的沖突)
- 415 (unsupported media type)- 接受到的表示不受支持
- 500 (internal server error)- 通用錯誤響應
- 503 (Service Unavailable)- 服務當前無法處理請求
DELETE
- 不安全但冪等
- 刪除資源
- 200 (OK)- 資源已被刪除
- 301 (Moved Permanently)- 資源的URI已更改
- 303 (See Other)- 其他,如負載均衡
- 400 (bad request)- 指代壞請求
- 404 (not found)- 資源不存在
- 409 (conflict)- 通用沖突
- 500 (internal server error)- 通用錯誤響應
- 503 (Service Unavailable)- 服務端當前無法處理請求
3.資源的表述
客戶端獲取的是資源的表述,而不是資源本身。例如文本資源有html、xml、json等格式。
客戶端可以通過Accept頭請求一種特定格式的表述,服務端則通過Content-Type告訴客戶端資源的表述形式。