RESTful API設(shè)計中常見的問題和解決方案

在開發(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:獲取某個具體消費者的訂單列表
...

RESTful API 設(shè)計指南

由于英語語法的特點和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的可以看到卸夕。

Star a gist

針對實例的實現(xiàn)如下:

POST /orders/{id}/cancellation

自定義方案

這個Google Could中Could API設(shè)計規(guī)范中定義的方案,語法為:

https://service.name/v1/some/resource/name:customVerb

Custom Methods

針對實例的實現(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猴蹂,一起剝皮案震驚了整個濱河市院溺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磅轻,老刑警劉巖覆获,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓢省,居然都是意外死亡弄息,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門勤婚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摹量,“玉大人,你說我怎么就攤上這事馒胆∮С疲” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵祝迂,是天一觀的道長睦尽。 經(jīng)常有香客問我,道長型雳,這世上最難降的妖魔是什么当凡? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任山害,我火速辦了婚禮,結(jié)果婚禮上沿量,老公的妹妹穿的比我還像新娘浪慌。我一直安慰自己,他們只是感情好朴则,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布权纤。 她就那樣靜靜地躺著,像睡著了一般乌妒。 火紅的嫁衣襯著肌膚如雪汹想。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天撤蚊,我揣著相機與錄音欧宜,去河邊找鬼。 笑死拴魄,一個胖子當(dāng)著我的面吹牛冗茸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匹中,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼夏漱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顶捷?” 一聲冷哼從身側(cè)響起挂绰,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎服赎,沒想到半個月后葵蒂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡重虑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年践付,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缺厉。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡永高,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出提针,到底是詐尸還是另有隱情命爬,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布辐脖,位于F島的核電站饲宛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗜价。R本人自食惡果不足惜艇抠,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一幕庐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧练链,春花似錦翔脱、人聲如沸奴拦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽错妖。三九已至绿鸣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暂氯,已是汗流浹背潮模。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痴施,地道東北人擎厢。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像辣吃,于是被迫代替她去往敵國和親动遭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345