RESTFul API規(guī)范侨嘀,看這篇就夠了

初嘗RESTFul規(guī)范

RESTFul是一種HTTP API接口規(guī)范臭挽,只要滿足的RESTFul規(guī)范,即可稱為RESTFul API咬腕。

既然是接口欢峰,我們先來(lái)了解一下,他和傳統(tǒng)的API接口有何不同吧郎汪。

本文以盡量簡(jiǎn)單明了的文字來(lái)介紹赤赊、描述,只講核心內(nèi)容煞赢,僅供入門(mén)指引抛计。

1 與傳統(tǒng)API的區(qū)別

RESTFul世界中,一切皆抽象為資源(Resource)照筑。

用戶是資源吹截,文章是資源、評(píng)論是資源凝危,抽象一點(diǎn)的session波俄、token等均是資源。

下面例子蛾默,我們通過(guò)以下幾個(gè)常用的HTTP方法對(duì)資源(圖書(shū))進(jìn)行操作懦铺。

RESTFul中:

操作 方法 示例
查詢 GET GET /books
增加 POST POST /books
修改 PUT PUT /books
刪除 DELETE DELETE /books

傳統(tǒng)API中:

操作 方法 示例
查詢 GET GET /api/book/getBook
增加 POST POST /api/book/addBook
修改 POST POST /api/book/updateBook
刪除 GET/POST POST /api/book/deleteBook

2 URL設(shè)計(jì)

RESTFul API規(guī)范很簡(jiǎn)單,關(guān)鍵只需滿足這一點(diǎn)支鸡。

動(dòng)詞(HTTP動(dòng)作) + 名詞(資源)

2.1 常用動(dòng)作

通常我們采用以下5種 HTTP方法(動(dòng)作)冬念。

  • GET:查詢(Read)
  • POST:增加(Create)
  • PUT:更新(Update)
  • PATCH:部分更新,不常用(Update)
  • DELETE:刪除(Delete)

2.2 名詞盡量復(fù)數(shù)

名詞盡量采用復(fù)數(shù)(語(yǔ)義更明確牧挣,但并不強(qiáng)制)急前,舉個(gè)例子:

類(lèi)型 操作 示例
單數(shù) 獲取所有圖書(shū) GET /book
單數(shù) 獲取ID為1的圖書(shū) GET /book/1
復(fù)數(shù) 獲取所有圖書(shū) GET /books
復(fù)數(shù) 獲取ID為1的圖書(shū) GET /books/1

不難發(fā)現(xiàn),復(fù)數(shù)形式語(yǔ)義更明確瀑构。

2.3 方法 & 過(guò)濾參數(shù)

方法應(yīng)當(dāng)以路徑(path)的方式傳遞:

示例:

  • 獲取部門(mén):GET /departments
  • 獲取部門(mén)下的所有員工:GET /departments/{id}/employees
  • 獲取部門(mén)下的某個(gè)員工:GET /departments/{id}/employees/{id}
  • 文章點(diǎn)贊:PUT /articles/{id}/praise

過(guò)濾參數(shù)應(yīng)當(dāng)以查詢字符串(QueryString)的方式傳遞:

示例:

  • 獲取第1頁(yè)裆针,每頁(yè)顯示10條:GET /books?page=1&per_page=10
  • 獲取已經(jīng)發(fā)布的文章:GET /articles?published=true(或等于1也行)

何時(shí)使用方法,何時(shí)使用過(guò)濾參數(shù)?

區(qū)別:

  • 方法:獲取后的數(shù)據(jù)結(jié)構(gòu)不同了世吨。
  • 過(guò)濾參數(shù):獲取后的數(shù)據(jù)結(jié)構(gòu)還是一樣的澡刹,只是數(shù)量減少了。

3 響應(yīng)請(qǐng)求

必須盡可能返回意義準(zhǔn)確的HTTP狀態(tài)碼耘婚,不要一味的返回200狀態(tài)碼像屋。

狀態(tài)碼主要分為5類(lèi):

在RESTFul中通常我們只需要用到2XX、4XX边篮、5XX。

  • 1XX:信息類(lèi)
  • 2XX:成功類(lèi)
  • 3XX:重定向
  • 4XX:客戶端錯(cuò)誤
  • 5XX:服務(wù)器錯(cuò)誤

有關(guān)狀態(tài)碼的詳細(xì)參考:HTTP狀態(tài)碼

常用HTTP狀態(tài)碼:

響應(yīng)碼 說(shuō)明
200 OK 請(qǐng)求已成功
201 Created 資源已創(chuàng)建
204 No Content 請(qǐng)求已成功奏甫,但無(wú)返回內(nèi)容
304 Not Modified 緩存有效
400 Bad Request 語(yǔ)義有誤戈轿,當(dāng)前請(qǐng)求無(wú)法被服務(wù)器理解,請(qǐng)求參數(shù)錯(cuò)誤
401 Unauthorized 當(dāng)前請(qǐng)求需要用戶認(rèn)證(登錄)
403 Forbidden 用戶已認(rèn)證(登錄)阵子,但權(quán)限不足
404 Not Found 請(qǐng)求源未在服務(wù)器上被發(fā)現(xiàn)
405 Method Not Allowed 請(qǐng)求方法不能被用于請(qǐng)求相應(yīng)的資源思杯,如使用PUT方法訪問(wèn)只接受POST方法的API
500 Internal Server Error 服務(wù)端內(nèi)部錯(cuò)誤
502 Bad Gateway 網(wǎng)關(guān)錯(cuò)誤
504 Gateway Timeout 網(wǎng)關(guān)超時(shí)

3.1 成功類(lèi)

對(duì)于成功類(lèi),除了GET請(qǐng)求需要返回響應(yīng)體(數(shù)據(jù))之外挠进,其他請(qǐng)求均可不返回響應(yīng)體色乾。

獲取文章:

返回200狀態(tài)碼,返回的數(shù)據(jù)不需要進(jìn)行多余的包裝领突。

GET /articles/1
HTTP/1.1 200 OK

{
    "title": "文章標(biāo)題",
    "content": "文章內(nèi)容"
}

增加文章:

返回201狀態(tài)碼暖璧,可選返回響應(yīng)體(創(chuàng)建后的對(duì)象)。

POST /articles
HTTP/1.1 201 Created

{
    "id": 1,
    "title": "文章標(biāo)題",
    "content": "文章內(nèi)容"
}
HTTP/1.1 201 Created

更新文章:

若返回響應(yīng)體(更新后的對(duì)象)則使用200狀態(tài)碼君旦,否則使用204狀態(tài)碼澎办。

PUT /articles/1
HTTP/1.1 200 OK

{
    "id": 1,
    "title": "文章標(biāo)題",
    "content": "文章內(nèi)容"
}
HTTP/1.1 204 No Content

刪除文章:

返回204狀態(tài)碼。

DELETE /articles/1
HTTP/1.1 204 No Content

3.2 錯(cuò)誤類(lèi)

建議為所有錯(cuò)誤的請(qǐng)求響應(yīng)體加上錯(cuò)誤代碼金砍、消息字段局蚀。

錯(cuò)誤代碼建議由HTTP狀態(tài)碼 + 自定義的錯(cuò)誤代碼組成。

例如:客戶端錯(cuò)誤狀態(tài)碼為400恕稠,賬號(hào)或密碼錯(cuò)誤代碼為01(自定義)琅绅,組成40001錯(cuò)誤代碼。

3.2.1 客戶端錯(cuò)誤

登錄失敹煳 :

POST /tokens/login
HTTP/1.1 400 Bad Request

{
    "error_code": 40001,
    "message": "用戶名或密碼錯(cuò)誤"
}

用戶名已被注冊(cè):

POST /users
HTTP/1.1 400 Bad Request

{
    "error_code": 40002,
    "message": "用戶名已被注冊(cè)"
}

未登錄:

HTTP/1.1 401 Unauthorized

{
    "error_code": 40101,
    "message": "用戶未登錄"
}

權(quán)限不足:

HTTP/1.1 403 Forbidden

{
    "error_code": 40301,
    "message": "權(quán)限不足"
}

文章不存在或已被刪除:

HTTP/1.1 404 Not Found

{
    "error_code": 40401,
    "message": "文章不存在或已被刪除"
}

3.2.2 服務(wù)器錯(cuò)誤

HTTP/1.1 500 Internal Server Error

{
    "error_code": 50001,
    "message": "服務(wù)器內(nèi)部錯(cuò)誤千扶,請(qǐng)稍后再試或聯(lián)系管理員"
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昆著,隨后出現(xiàn)的幾起案子县貌,更是在濱河造成了極大的恐慌,老刑警劉巖凑懂,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煤痕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)摆碉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)塘匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巷帝,你說(shuō)我怎么就攤上這事忌卤。” “怎么了楞泼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵驰徊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堕阔,道長(zhǎng)棍厂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任超陆,我火速辦了婚禮牺弹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘时呀。我一直安慰自己张漂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布谨娜。 她就那樣靜靜地躺著航攒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趴梢。 梳的紋絲不亂的頭發(fā)上屎债,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音垢油,去河邊找鬼盆驹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滩愁,可吹牛的內(nèi)容都是我干的躯喇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼硝枉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼廉丽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起妻味,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤正压,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后责球,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體焦履,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拓劝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘉裤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郑临。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屑宠,靈堂內(nèi)的尸體忽然破棺而出厢洞,到底是詐尸還是另有隱情,我是刑警寧澤典奉,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布躺翻,位于F島的核電站,受9級(jí)特大地震影響卫玖,放射性物質(zhì)發(fā)生泄漏获枝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一骇笔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嚣崭,春花似錦笨触、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至说榆,卻和暖如春虚吟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背签财。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工串慰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唱蒸。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓邦鲫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親神汹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庆捺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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