REST 接口學習


一、REST 接口

在請求層面,REST 規范可以簡單粗暴抽象成以下兩個規則:

請求 API 的 URL 表示用來定位資源;
請求的 METHOD 表示對這個描述資源進行的操作;

知乎大神Ivony有句話說的好:

URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。

在設計web接口的時候,REST主要是用於定義接口名,接口名一般是用名詞寫,不用動詞,那怎么表達“獲取”或者“刪除”或者“更新”這樣的操作呢——用請求類型來區分。

比如,我們有一個friends接口,對於“朋友”我們有增刪改查四種操作,怎么定義REST接口?

增加一個朋友,uri: generalcode.cn/v1/friends 接口類型:POST

刪除一個朋友,uri: generalcode.cn/va/friends 接口類型:DELETE

修改一個朋友,uri: generalcode.cn/va/friends 接口類型:PUT

查找朋友,uri: generalcode.cn/va/friends 接口類型:GET

注意:這就是REST接口,用url定位資源,用HTTP描述操作

上面我們定義的四個接口就是符合REST協議的,請注意,這幾個接口都沒有動詞,只有名詞friends,都是通過Http請求的接口類型來判斷是什么業務操作。

二、API的請求方法

在很多系統中,幾乎只用 GET 和 POST 方法來完成了所有的接口操作;這個行為類似於全用 DIV 來布局。實際上,我們不只有GET 和 POST 可用,在 REST 架構中,有以下幾個重要的請求方法:GET,POST,PUT,PATCH,DELETE。這幾個方法都可以與對數據的 CRUD 操作對應起來。

CRUD 是指在做計算處理時的增加(Create)、讀取查詢(Retrieve)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。即增刪改查

【Read】,資源的讀取,用 GET 請求;比如:
GET /api/users ( 表示讀取用戶列表)

GET 應當實現為一個安全方法。用於獲取數據而不應該產生副作用。

【Created】,資源的創建,用 POST 方法;POST 是一個非冪等的方法,多次調用會造成不同效果;
【Update】,資源的更新。用於更新的 HTTP 方法有兩個,PUT 和 PATCH。

他們都應當被實現為冪等方法,即多次同樣的更新請求應當對服務器產生同樣的副作用。

PUT 和 PATCH 有各自不同的使用場景:

PUT 用於更新資源的全部信息,在請求的 body 中需要傳入修改后的全部資源主體;

而 PATCH 用於局部更新,在 body 中只需要傳入需要改動的資源字段。

【Delete】,資源的刪除,相應的請求 HTTP 方法就是 DELETE。這個也應當被實現為一個冪等的方法。

三、狀態碼

服務器向用戶返回的狀態碼和提示信息,常見的有以下一些(方括號中是該狀態碼對應的HTTP動詞)。

  • 200 OK - [GET]:服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。
  • 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
  • 202 Accepted - [*]:表示一個請求已經進入后台排隊(異步任務)
  • 204 NO CONTENT - [DELETE]:用戶刪除數據成功。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操作,該操作是冪等的。
  • 401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
  • 403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。
  • 404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。
  • 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式)。
  • 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 當創建一個對象時,發生一個驗證錯誤。
  • 500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將無法判斷發出的請求是否成功。

四、返回結果

針對不同操作,服務器向用戶返回的結果應該符合以下規范。

  • GET /collection:返回資源對象的列表(數組)
  • GET /collection/resource:返回單個資源對象
  • POST /collection:返回新生成的資源對象
  • PUT /collection/resource:返回完整的資源對象
  • PATCH /collection/resource:返回完整的資源對象
  • DELETE /collection/resource:返回一個空文檔


免責聲明!

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



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