一、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:返回一個空文檔