RESTful接口


一、定義

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告訴客戶端資源的表述形式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM