10個有關(guān)RESTful API良好設(shè)計的最佳實踐

Web API已經(jīng)在最近幾年變成重要的話題,一個干凈的API設(shè)計對于后端系統(tǒng)是非常重要的。

通常我們?yōu)閃eb API使用RESTful設(shè)計,REST概念分離了API結(jié)構(gòu)和邏輯資源,通過Http方法GET, DELETE, POST 和 PUT來操作資源。

下面是進(jìn)行RESTful Web API十個最佳實踐,能為你提供一個良好的API設(shè)計風(fēng)格。

1.使用名詞而不是動詞
Resource
資源

GET
讀 POST
創(chuàng)建 PUT
修改 DELETE
/cars 返回 cars集合 創(chuàng)建新的資源 批量更新cars 刪除所有cars
/cars/711 返回特定的car 該方法不允許(405) 更新一個指定的資源 擅長指定資源
不要使用:

/getAllCars
/createNewCar
/deleteAllRedCars

2.Get方法和查詢參數(shù)不應(yīng)該涉及狀態(tài)改變
使用PUT, POST 和DELETE 方法 而不是 GET 方法來改變狀態(tài),不要使用GET 進(jìn)行狀態(tài)改變:

GET /users/711?activate
GET /users/711/activate

3.使用復(fù)數(shù)名詞
不要混淆名詞單數(shù)和復(fù)數(shù),為了保持簡單,只對所有資源使用復(fù)數(shù)。

/cars 而不是 /car
/users 而不是 /user
/products 而不是 /product
/settings 而部署 /setting

  1. 使用子資源表達(dá)關(guān)系
    如果一個資源與另外一個資源有關(guān)系,使用子資源:

GET /cars/711/drivers/ 返回 car 711的所有司機(jī)
GET /cars/711/drivers/4 返回 car 711的4號司機(jī)

5.使用Http頭聲明序列化格式
在客戶端和服務(wù)端,雙方都要知道通訊的格式,格式在HTTP-Header中指定

Content-Type 定義請求格式
Accept 定義系列可接受的響應(yīng)格式

6.使用HATEOAS
Hypermedia as the Engine of Application State 超媒體作為應(yīng)用狀態(tài)的引擎,超文本鏈接可以建立更好的文本瀏覽:

{

"id": 711,

"manufacturer": "bmw",

"model": "X5",

"seats": 5,

"drivers": [

{

"id": "23",

"name": "Stefan Jauker",

"links": [

 {

 "rel": "self",

 "href": "/api/v1/drivers/23"

}

]

}

]

}

注意href指向下一個URL

7.為集合提供過濾 排序 選擇和分頁等功能
Filtering過濾:

使用唯一的查詢參數(shù)進(jìn)行過濾:

GET /cars?color=red 返回紅色的cars
GET /cars?seats<=2 返回小于兩座位的cars集合

Sorting排序:

允許針對多個字段排序

GET /cars?sort=-manufactorer,+model

這是返回根據(jù)生產(chǎn)者降序和模型升序排列的car集合

Field selection

移動端能夠顯示其中一些字段,它們其實不需要一個資源的所有字段,給API消費者一個選擇字段的能力,這會降低網(wǎng)絡(luò)流量,提高API可用性。

GET /cars?fields=manufacturer,model,id,color

Paging分頁

使用 limit 和offset.實現(xiàn)分頁,缺省limit=20 和offset=0;

GET /cars?offset=10&limit=5

為了將總數(shù)發(fā)給客戶端,使用訂制的HTTP頭: X-Total-Count.

鏈接到下一頁或上一頁可以在HTTP頭的link規(guī)定,遵循Link規(guī)定:

Link: https://blog.mwaysolutions.com/sample/api/v1/cars?offset=15&limit=5; rel="next",
https://blog.mwaysolutions.com/sample/api/v1/cars?offset=50&limit=3; rel="last",
https://blog.mwaysolutions.com/sample/api/v1/cars?offset=0&limit=5; rel="first",
https://blog.mwaysolutions.com/sample/api/v1/cars?offset=5&limit=5; rel="prev",

8.版本化你的API
使得API版本變得強制性,不要發(fā)布無版本的API,使用簡單數(shù)字,避免小數(shù)點如2.5.

一般在Url后面使用?v

/blog/api/v1

  1. 使用Http狀態(tài)碼處理錯誤
    如果你的API沒有錯誤處理是很難的,只是返回500和出錯堆棧不一定有用

Http狀態(tài)碼提供70個出錯,我們只要使用10個左右:

200 – OK – 一切正常
201 – OK – 新的資源已經(jīng)成功創(chuàng)建
204 – OK – 資源已經(jīng)成功擅長

304 – Not Modified – 客戶端使用緩存數(shù)據(jù)

400 – Bad Request – 請求無效,需要附加細(xì)節(jié)解釋如 "JSON無效"
401 – Unauthorized – 請求需要用戶驗證
403 – Forbidden – 服務(wù)器已經(jīng)理解了請求,但是拒絕服務(wù)或這種請求的訪問是不允許的。
404 – Not found – 沒有發(fā)現(xiàn)該資源
422 – Unprocessable Entity – 只有服務(wù)器不能處理實體時使用,比如圖像不能被格式化,或者重要字段丟失。

500 – Internal Server Error – API開發(fā)者應(yīng)該避免這種錯誤。

使用詳細(xì)的錯誤包裝錯誤:

{

"errors": [

{

"userMessage": "Sorry, the requested resource does not exist",

"internalMessage": "No car found in the database",

"code": 34,

"more info": "http://dev.mwaysolutions.com/blog/api/v1/errors/12345"

}

]

}

10.允許覆蓋http方法
一些代理只支持POST 和 GET方法, 為了使用這些有限方法支持RESTful API,需要一種辦法覆蓋http原來的方法。

使用訂制的HTTP頭 X-HTTP-Method-Override 來覆蓋POST 方法.

參考阮一峰的rest設(shè)計

http://www.ruanyifeng.com/blog/2014/05/restful_api.html
參考

https://blog.csdn.net/houjixin/article/details/54315835

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容