RESTful API 設計總結

RESTful API 設計總結

@(技術-架構)[API, 規範, 設計]git

RESTful的接口設計風格應用的愈來愈普遍,包括Spring Cloud等微服務架構平臺之間的調用都是以RESTful設計風格爲主,可是不少程序猿依然是停留在表面的理解上,沒有深入的去理解使用RESTful風格規範,同時在設計RESTful接口的時候是有不少細節須要思考,如下就是我的對RESTful接口的深刻理解以及總結。github


一、協議&域名&版本

協議:API與用戶的通訊協議,老是使用HTTPS協議。
域名:能夠部署專有域名或者是主域名下加入URL裏面。json

https://api.github.com
https://github.com/apiapi

版本:應該將API的版本號放入URL。數組

https://github.com/v1服務器

二、CURD的請求設計

REST的關鍵原則把API分解成一種邏輯上的資源。這些資源能夠經過有具體含義的HTTP方法(GET, POST, PUT, PATCH, DELETE)來進行修改。架構

GET /users - 獲取user列表
GET /users/12 - 獲取指定ID爲12的user對象
POST /users - 建立一個新的user
PUT /users/12 - 更新id爲12的user
PATCH /users/12 - 對id爲12的user進行部分更新
DELETE /users/12 - 刪除id爲12的userapp

① 新增:新增對象通常用到的是POST方法。異步

POST /users - 建立一個新的user
POST /users?count=4 - 批量建立user對象微服務

② 刪除:DELETE做爲刪除的方法

DELETE /users/12 - 刪除id爲12的user
DELETE /users [134 , 232 , 223 , 442] - 批量刪除id爲134 , 232 , 223 , 442的user

③ 更新:PUT、PATCH都是做爲更新的HTTP方法,PUT表示更新USER對象,PATCH是對對象部分更新

PUT /users/12 - 更新id爲12的user
PUT /users - 批量更新user
PATCH /users/12 - 對id爲12的user進行部分更新
PATCH /users - 批量對user進行部分更新

④ 查詢:GET通常做爲查詢的HTTP方法,如何優雅的知足複雜的接口,不是一件很值得探討的事情。
查詢單個對象

GET /users/12 - 獲取指定ID爲12的user對象

查詢多個對象

GET /users - 獲取user列表

條件過濾與分頁查詢

GET /users?page=3&page_count=30:指定第幾頁,以及每頁的記錄數。
GET /users?sortby=name&order=asc:指定返回結果按照哪一個屬性排序,以及排序順序。
GET /users?role_id=1:指定篩選條件

查詢多個對象時,通常返回對象的列表,當分頁查詢須要返回查詢的總的數據,應當在響應頭部裏面加入X-Total-Count的參數,同時在頭部加入X-Page和X-Page-Size參數。

X-Total-Count:1023
X-Page:3
X-Page-Size:30

複雜的查詢條件當咱們使用高級搜索的時候,GET方法的參數長度是無法知足查詢的需求,這時候咱們能夠用POST方法提交參數實體來實現需求。

POST /users/search?page=3&page_count=30
{

name : admin ,
phone : 124 ,
sex : 1

}

過濾返回對象屬性

GET /users/12?fields=id,name,phone - 設置返回對象的屬性

三、返回結果設計

針對不一樣操做,服務器向用戶返回的結果應該符合如下規範。

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

狀態碼

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 - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。

錯誤處理若是狀態碼是4xx,就應該向用戶返回出錯信息。通常來講,返回的信息中將error做爲鍵名,出錯信息做爲鍵值便可

{
error: "Invalid API key"
}

四、Hypermedia API

RESTful API最好作到Hypermedia,即返回結果中提供連接,連向其餘API方法,使得用戶不查文檔,也知道下一步應該作什麼。
好比,當用戶向api.github.com的根目錄發出請求,會獲得這樣一個文檔。

{"link": {
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}}

上面代碼表示,文檔中有一個link屬性,用戶讀取這個屬性就知道下一步該調用什麼API了。rel表示這個API與當前網址的關係(collection關係,並給出該collection的網址),href表示API的路徑,title表示API的標題,type表示返回類型。
Hypermedia API的設計被稱爲HATEOAS。Github的API就是這種設計,訪問api.github.com會獲得一個全部可用API的網址列表。

{
"current_user_url": "https://api.github.com/user",
"authorizations_url": "https://api.github.com/authorizations",
// ...
}

從上面能夠看到,若是想獲取當前用戶的信息,應該去訪問api.github.com/user,而後就獲得了下面結果。

{
"message": "Requires authentication",
"documentation_url": "https://developer.github.com/v3"
}

上面代碼表示,服務器給出了提示信息,以及文檔的網址。

相關文章
相關標籤/搜索