RESTful API的十個最佳實踐

RESTful API的十個最佳實踐 - 小白哥哥 - 博客園

WebAPI在過去幾年里非常的盛行,我們很多以往的技術手段都慢慢的轉(zhuǎn)換為使用WebAPI來開發(fā)催烘,因為它的語法簡單規(guī)范化遥赚,以及輕量級等特點唯绍,這種方式收到了廣泛的推崇蛉腌。

通常我們使用RESTFul(Representational State Transfer)的設計方式來設計Web api肉拓,這通常用來分離API結(jié)構(gòu)了業(yè)務邏輯,它使用典型的HTTP方法竞穷,諸如GET,POST.DELETE,PUT來和資源進行交互唐责。

以下是設計RESTful API的是個最佳實踐:

1. 使用名詞而不是動詞

為了易于理解,為資源使用下面的API結(jié)構(gòu):

Resource ?Get

read

Post

create

Put

update

Delete

/cars返回一個car的列表創(chuàng)建一個新的car更新car的信息刪除所有的car

/cars/2返回指定的carMethod not allowed(405)更新指定的car的信息刪除指定的car


不要使用動詞

/getAllCars

/createNewCar

/deleteAllRedCars


2. Get方法和查詢參數(shù)不應該改變資源狀態(tài)

使用Put,Post和Delete方法替代Get方法來改變資源狀態(tài)瘾带。不要使用Get來使狀態(tài)改變:

GET /users/711?activate or

GET /users/711/activate


3. 使用名詞的復數(shù)形式

不要混合使用單數(shù)和復數(shù)形式鼠哥,而應該為所有資源一直保持使用復數(shù)形式:

/cars instead of /car

/users instead of /user

/products instead of /product

/settings instead of /setting


4. 為關系使用子資源

假如資源連接到其它資源熟菲,則使用子資源形式:

GET /cars/711/drivers/ Returns a list of drivers for car 711

GET /cars/711/drivers/4 Returns driver #4 for car 711


5. 使用HTTP頭決定序列化格式

在客戶端和服務端都需要知道使用什么格式來進行通信,這個格式應該在HTTP頭中指定:

Content-Type:定義請求的格式朴恳;

Accept :定義允許的響應格式的列表


6. 使用HATEOAS

Hypermedia?as?the?Engine?of?Application?State是一個指導原則抄罕,它規(guī)定超文本鏈接應該被用于在API中創(chuàng)建更好的資源導航:

{

? "id": 711,

? "manufacturer": "bmw",

? "model": "X5",

? "seats": 5,

? "drivers": [

? {

? ? "id": "23",

? ? "name": "Stefan Jauker",

? ? "links": [

? ? {

? ? "rel": "self",

? ? "href": "/api/v1/drivers/23"? ? }

? ]

? }

]

}


7. 為集合提供過濾、排序于颖、字段選擇以及分頁

過濾

為所有字段或者查詢語句提供獨立的查詢參數(shù):

GET /cars?color=red Returns a list of red cars

GET /cars?seats<=2 Returns a list of cars with a maximum of 2 seats

排序

允許跨越多字段的正序或者倒序排列:

GET /cars?sort=-manufactorer,+model

字段選擇

一些情況下呆贿,我們只需要在列表中查詢幾個有標識意義的字段,我們不需要從服務端把所有字段的值都請求出來森渐,所以需要支持API選擇查詢字段的能力做入,這也可以提到網(wǎng)絡傳輸性能和速度:

GET /cars?fields=manufacturer,model,id,color

分頁

使用offset和limit來獲取固定數(shù)量的資源結(jié)果,當其中一個參數(shù)沒有出現(xiàn)時同衣,應該提供各自的默認值竟块,比如默認取第一頁,或者默認取20條數(shù)據(jù):

GET /cars?offset=10&limit=5

GET /cars?&limit=5? //Get first five result

GET /cars?&offset=5? //Get default amount result offset 5

使用自定義的頭X-Total-Count發(fā)回給調(diào)用段實際的資源數(shù)量耐齐。

前一頁后一頁的鏈接也應該在HTTP頭鏈接中得到支持浪秘,遵從下文中的鏈接原則而不要構(gòu)建你自己的頭:

Link:; rel="next",; rel="last",; rel="first",; rel="prev",


8. 版本化你的API

確保強制實行API版本,并且不要發(fā)布一個沒有版本的API埠况,使用簡單的序列數(shù)字耸携,避免使用2.5.0這樣的形式:

/blog/api/v1


9. 使用HTTP狀態(tài)碼處理錯誤

忽略錯誤處理的API是很難使用的,簡單的返回500和調(diào)用堆棧是非常不友好也非常無用的:

使用HTTP狀態(tài)碼

HTTP標準提供了70多個狀態(tài)碼來描述返回值辕翰,我們不需要完全用到他們夺衍,下文中列出10個使用率較高的:

200 – OK – 一切正常

201 – OK – 新資源已經(jīng)被創(chuàng)建

204 – OK – 資源刪除成功

304 – 沒有變化隙券,客戶端可以使用緩存數(shù)據(jù)

400 – Bad Request – 調(diào)用不合法块差,確切的錯誤應該在error payload中描述,例如:“JSON 不合法 ”

401 – 未認證硫眨,調(diào)用需要用戶通過認證

403 – 不允許的渊抄,服務端正常解析和請求尝胆,但是調(diào)用被回絕或者不被允許

404 – 未找到,指定的資源不存在

422 – 不可指定的請求體 – 只有服務器不能處理實體時使用护桦,比如圖像不能被格式化含衔,或者重要字段丟失。

500 – Internal Server Error – 標準服務端錯誤二庵,API開發(fā)人員應該盡量避開這種錯誤

使用 error payloads

所有的異常都應該被映射到error payloads中贪染,下文中的例子是一個json payload的模板:

{

? "errors": [

? {

? ? "userMessage": "Sorry, the requested resource does not exist",

? ? "internalMessage": "No car found in the database",

? ? "code": 34,

? ? "more info": "http://dev.mwaysolutions.com/blog/api/v1/errors/12345"? }

? ]

}


10. 允許重寫HTTP方法

一些代理只支持GET和POST方法,為了在這種限制下支持RESTful API催享,API需要重寫HTTP方法杭隙。

使用自定義的X-HTTP-Method-Override? HTTP頭來重寫POST方法。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末因妙,一起剝皮案震驚了整個濱河市痰憎,隨后出現(xiàn)的幾起案子票髓,更是在濱河造成了極大的恐慌,老刑警劉巖铣耘,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽沟,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜗细,警方通過查閱死者的電腦和手機裆操,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炉媒,“玉大人踪区,你說我怎么就攤上這事〕饕埃” “怎么了朽缴?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長水援。 經(jīng)常有香客問我,道長茅郎,這世上最難降的妖魔是什么蜗元? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮系冗,結(jié)果婚禮上奕扣,老公的妹妹穿的比我還像新娘。我一直安慰自己掌敬,他們只是感情好惯豆,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奔害,像睡著了一般楷兽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上华临,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天芯杀,我揣著相機與錄音,去河邊找鬼雅潭。 笑死揭厚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扶供。 我是一名探鬼主播筛圆,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椿浓!你這毒婦竟也來了太援?” 一聲冷哼從身側(cè)響起漾岳,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粉寞,沒想到半個月后尼荆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡唧垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年捅儒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片振亮。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡巧还,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坊秸,到底是詐尸還是另有隱情麸祷,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布褒搔,位于F島的核電站阶牍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏星瘾。R本人自食惡果不足惜走孽,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琳状。 院中可真熱鬧磕瓷,春花似錦、人聲如沸念逞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翎承。三九已至硕盹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間审洞,已是汗流浹背莱睁。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芒澜,地道東北人仰剿。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像痴晦,于是被迫代替她去往敵國和親南吮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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