在開發(fā)HTTP API的時候,我們一般會按照REST風(fēng)格來設(shè)計愧捕,符合REST風(fēng)格的API也稱為RESTful API奢驯。
RESTful API的主要規(guī)則包括以下幾點:
- URI表示資源(名詞)
- HTTP請求的方法表示動作申钩,指對資源的操作
標(biāo)準(zhǔn)的RESTful API示例如下:
POST /customers:創(chuàng)建一個消費者
GET /customers:獲取消費者列表
GET /customers/{id}:獲取某個具體的消費者
PUT /customers/{id}:更新某個具體的消費者信息(全量更新)
PATCH /customers/{id}:更新某個具體的消費者的信息(部分更新)
DELETE /customers/{id}:刪除某個具體的消費者
// 有聯(lián)系的資源之間的處理
GET /customers/{id}/orders:獲取某個具體消費者的訂單列表
...
由于英語語法的特點和HTTP請求的方法數(shù)量的有限次绘,可能存在一些無法覆蓋到的部分,如下:
- 非常規(guī)動作
- 資源對應(yīng)的名詞形式造成的問題:單復(fù)數(shù)一致,不可數(shù)
- 資源之間的關(guān)系是一對一
下面來談?wù)勆鲜鑫锤采w部分及其解決方案邮偎。
非常規(guī)動作的RESTful API的設(shè)計
常規(guī)動作有GET,POST,PUT,PATCH和DELETE管跺,也就是所謂的增刪改查,但是現(xiàn)實中還有很多非前面提到的動作禾进,如取消操作豁跑。
針對非常規(guī)動作,解決的方案有兩種:
- 動詞名詞化:將動詞轉(zhuǎn)成名詞泻云,進(jìn)而當(dāng)做前面資源的子資源進(jìn)行處理
- 自定義方案:使用自定義的規(guī)范來支持非常規(guī)動作
下面我們以取消訂單為例艇拍,來看看針對該問題不同方案的實現(xiàn)。
動詞名詞化
該方案是GitHub在使用中的方案宠纯,在開放的API的可以看到卸夕。
針對實例的實現(xiàn)如下:
POST /orders/{id}/cancellation
自定義方案
這個Google Could中Could API設(shè)計規(guī)范中定義的方案,語法為:
https://service.name/v1/some/resource/name:customVerb
針對實例的實現(xiàn)如下:
POST /orders/{id}:cancel
資源對應(yīng)的名詞形式造成的問題的解決
資源對應(yīng)的名詞單復(fù)數(shù)一致
該情況可按照英語語法使用對應(yīng)的名詞即可婆瓜,如下:
// 單復(fù)數(shù)一致
GET /advice
GET /advice/{id}
資源對應(yīng)的名詞為不可數(shù)名詞
使用可數(shù)名詞來代替快集,如news可以用news-items來代替。
資源之間的關(guān)系是一對一情況的處理
這種情況可以采用資源對應(yīng)的名詞的單數(shù)形式來表示獲取一條數(shù)據(jù), 該方案也適用于多對一的情況廉白。
例如:用戶的購物車數(shù)據(jù)个初,每個用戶有一個購物車,可以表示如下:
GET /customers/{id}/cart