一、協(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。