RESTful API設(shè)計(jì)理念

一、協(xié)議

API?與用戶的通信協(xié)議,?總是使用 HTTPs?協(xié)議.

二、域名

應(yīng)該盡量將 API?部署在專用域名之下.

https://api.example.com

如果 API?很簡單,?不會有進(jìn)一步擴(kuò)展,?可以考慮放在主域名下.

https://example.org/api/

三、版本

應(yīng)該將 API?的版本號放入 URL.

https://api.example.com/v1/

另一種做法是,?將版本號放在 HTTP?頭信息中,?但不如放入 URL?方便和直觀.

四、路徑

路徑又稱"終點(diǎn)"(endpoint),?表示 API?的具體網(wǎng)址.

在 RESTful?架構(gòu)中,?每個(gè)網(wǎng)址代表一種資源,?所以網(wǎng)址中不能有動(dòng)詞,?只能有名詞,?而且所用的名詞往往與數(shù)據(jù)庫的表格名對應(yīng).?一般來說,?數(shù)據(jù)庫中的表都是同種記錄的"集合",?所以 API?中的名詞也應(yīng)該使用復(fù)數(shù).

舉例來說,?有一個(gè) API?提供動(dòng)物園的信息,?還包括各種動(dòng)物和雇員的信息,?則它的路徑應(yīng)該設(shè)計(jì)成下面這樣.

https://api.example.com/v1/zoos

https://api.example.com/v1/animals

https://api.example.com/v1/employees

五、HTTP 動(dòng)詞

GET(select):?從服務(wù)器取出資源(一項(xiàng)或多項(xiàng)).

POST(create):在服務(wù)器新建一個(gè)資源.

PUT(update):在服務(wù)器更新資源(客戶端提供該變后的完整資源).

PATCH(update):在服務(wù)器更新資源(客戶端提供改變的屬性).

DELETE(delete):?從服務(wù)器刪除資源.

六、過濾信息

如果記錄數(shù)量很多,?服務(wù)器不可能都將他們返回給用戶.?API應(yīng)該提供參數(shù),?過濾返回結(jié)果.

?limit=10:?指定返回記錄的數(shù)量.

?offset=10:?指定返回記錄的開始位置.

?page=2&per_page=100:?指定第幾頁,?以及每頁的紀(jì)律數(shù).

?sortby=name&order=asc:?指定返回結(jié)果按照哪個(gè)屬性排序,?以及排序順序.

?animal_type_id=1:?指定篩選條件.

七、狀態(tài)碼

200 OK - [GET]:服務(wù)器成功返回用戶請求的數(shù)據(jù),該操作是冪等的(Idempotent)。

201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數(shù)據(jù)成功。

202 Accepted - [*]:表示一個(gè)請求已經(jīng)進(jìn)入后臺排隊(duì)(異步任務(wù))

204 NO CONTENT - [DELETE]:用戶刪除數(shù)據(jù)成功。

400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發(fā)出的請求有錯(cuò)誤,服務(wù)器沒有進(jìn)行新建或修改數(shù)據(jù)的操作,該操作是冪等的。

401 Unauthorized - [*]:表示用戶沒有權(quán)限(令牌、用戶名、密碼錯(cuò)誤)。

403 Forbidden - [*] 表示用戶得到授權(quán)(與401錯(cuò)誤相對),但是訪問是被禁止的。

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)建一個(gè)對象時(shí),發(fā)生一個(gè)驗(yàn)證錯(cuò)誤。

500 INTERNAL SERVER ERROR - [*]:服務(wù)器發(fā)生錯(cuò)誤,用戶將無法判斷發(fā)出的請求是否成功。

八、錯(cuò)誤處理

如果狀態(tài)碼是 4xx,?就應(yīng)該向用戶返回出錯(cuò)信息.?一般來說,?返回信息中將 error?作為鍵名,?出錯(cuò)信息作為鍵值即可.

{ error: "Invalid API key"}

九、返回結(jié)果

針對不同操作,?服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范.

GET /collection:返回資源對象的列表(數(shù)組)

GET /collection/resource:返回單個(gè)資源對象

POST /collection:返回新生成的資源對象

PUT /collection/resource:返回完整的資源對象

PATCH /collection/resource:返回完整的資源對象

DELETE /collection/resource:返回一個(gè)空文檔

十、Hypermedia API

RESTful API最好做到Hypermedia,?即返回結(jié)果中提供鏈接,?連向其他 API?方法,?使用戶不查文檔,?也知道下一步該做什么.

比如,當(dāng)用戶向api.example.com的根目錄發(fā)出請求,會得到這樣一個(gè)文檔。

{"link": {

?"rel": "collectionhttps://www.example.com/zoos",?

"href": "https://api.example.com/zoos",

?"title": "List of zoos",?

?"type": "application/vnd.yourformat+json"

}}

上面代碼表示,?文檔中有一個(gè) link?屬性,?用戶讀取這個(gè)屬性就知道下一步調(diào)用什么 API?了.?rel?表示這個(gè) API?與當(dāng)前網(wǎng)址的關(guān)系(collection?關(guān)系,?并給出該 collection?的網(wǎng)址), href?表示 API?的路徑, title?表示 API?的標(biāo)題, type?表示返回類型.

Github的API就是這種設(shè)計(jì),訪問api.github.com會得到一個(gè)所有可用API的網(wǎng)址列表。

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

從上面可以看到,如果想獲取當(dāng)前用戶的信息,應(yīng)該去訪問api.github.com/user,然后就得到了下面結(jié)果。

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

十一、其他

(1)API的身份認(rèn)證應(yīng)該使用OAuth 2.0框架。

(2)服務(wù)器返回的數(shù)據(jù)格式,應(yīng)該盡量使用JSON,避免使用XML。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容