API設(shè)計(jì)規(guī)范(RESTful)
一烤芦、協(xié)議
采用HTTPs
二胁编、域名
https:// example.org/api/
三呻惕、版本
將版本號放在HTTP頭信息里面
四酷鸦、路徑
路徑又稱"終點(diǎn)"(endpoint)饰躲,表示API的具體網(wǎng)址。在RESTful架構(gòu)中臼隔,每個網(wǎng)址代表一種資源(resource)滑废,所以網(wǎng)址中不能有動詞寡痰,只能有名詞,而且所用的詞往往與數(shù)據(jù)庫的表格名對應(yīng)。一般來說诱咏,數(shù)據(jù)庫中的表都是同種記錄的"集合"(collection),所以API中的名詞也應(yīng)該使用復(fù)數(shù)萤彩。舉例來說村视,有一個API提供動物園(zoo)的信息,還包括各種動物和雇員的信息盛正,則它的路徑應(yīng)該設(shè)計(jì)成下面這樣删咱。
https://api.example.com/zoos
https://api.example.com/animals
https://api.example.com/employees
五、HTTP動詞
對于資源的具體操作類型豪筝,由HTTP動詞表示痰滋。
常用的HTTP動詞有下面五個(括號里是對應(yīng)的SQL命令)。
GET(SELECT):從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))续崖。
POST(CREATE):在服務(wù)器新建一個資源即寡。
PUT(UPDATE):在服務(wù)器更新資源(客戶端提供改變后的完整資源)。
PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供改變的屬性)袜刷。
DELETE(DELETE):從服務(wù)器刪除資源聪富。
還有兩個不常用的HTTP動詞。
HEAD:獲取資源的元數(shù)據(jù)著蟹。
OPTIONS:獲取信息墩蔓,關(guān)于資源的哪些屬性是客戶端可以改變的梢莽。下面是一些例子。
GET /zoos:列出所有動物園
POST /zoos:新建一個動物園
GET /zoos/ID:獲取某個指定動物園的信息
PUT /zoos/ID:更新某個指定動物園的信息(提供該動物園的全部信息)
PATCH /zoos/ID:更新某個指定動物園的信息(提供該動物園的部分信息)
DELETE /zoos/ID:刪除某個動物園
GET /zoos/ID/animals:列出某個指定動物園的所有動物
DELETE /zoos/ID/animals/ID:刪除某個指定動物園的指定動物
六奸披、過濾信息
如果記錄數(shù)量很多昏名,服務(wù)器不可能都將它們返回給用戶。API應(yīng)該提供參數(shù)阵面,過濾返回結(jié)果轻局。
下面是一些常見的參數(shù)。
?limit=10:指定返回記錄的數(shù)量
?offset=10:指定返回記錄的開始位置样刷。
?page=2&per_page=100:指定第幾頁仑扑,以及每頁的記錄數(shù)。
?sortby=name&order=asc:指定返回結(jié)果按照哪個屬性排序置鼻,以及排序順序镇饮。
?animal_type_id=1:指定篩選條件
參數(shù)的設(shè)計(jì)允許存在冗余,即允許API路徑和URL參數(shù)偶爾有重復(fù)箕母。比如储藐,GET /zoo/ID/animals 與 GET / animals?zoo_id=ID 的含義是相同的。
七嘶是、狀態(tài)碼
服務(wù)器向用戶返回的狀態(tài)碼和提示信息钙勃,常見的有以下一些(方括號中是該狀態(tài)碼對應(yīng)的HTTP動詞)。
200 OK - [GET]:服務(wù)器成功返回用戶請求的數(shù)據(jù)聂喇,該操作是冪等的(Idempotent)肺缕。
201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功。
202 Accepted - [*]:表示一個請求已經(jīng)進(jìn)入后臺排隊(duì)(異步任務(wù))
204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功授帕。
400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯誤同木,服務(wù)器沒有進(jìn)行新建或修改數(shù)據(jù)操 作,該操作是冪等的跛十。
401 Unauthorized - [*]:表示用戶沒有權(quán)限(令牌彤路、用戶名、密碼錯誤)芥映。
403 Forbidden - [*] 表示用戶得到授權(quán)(與401錯誤相對)洲尊,但是訪問是被禁止的。
404 NOT FOUND - [*]:用戶發(fā)出的請求針對的是不存在的記錄奈偏,服務(wù)器沒有進(jìn)行操作坞嘀,該操作是冪等的。
406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式惊来,但是只有XML格式)丽涩。
410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 當(dāng)創(chuàng)建一個對象時矢渊,發(fā)生一個驗(yàn)證錯誤继准。
500 INTERNAL SERVER ERROR - [*]:服務(wù)器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功矮男。
狀態(tài)碼的完全列表參見這里移必。
八、錯誤處理
如果狀態(tài)碼是4xx毡鉴,就應(yīng)該向用戶返回出錯信息崔泵。一般來說,返回的信息中將error作為鍵名猪瞬,出錯信息作為鍵 值即可憎瘸。
{
error: "Invalid API key"
}
九、返回結(jié)果
針對不同操作撑螺,服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范。
GET /collection:返回資源對象的列表(數(shù)組)
GET /collection/resource:返回單個資源對象
POST /collection:返回新生成的資源對象
PUT /collection/resource:返回完整的資源對象
PATCH /collection/resource:返回完整的資源對象
DELETE /collection/resource:返回一個空文檔
十崎弃、其他
服務(wù)器返回的數(shù)據(jù)格式甘晤,使用JSON