restful接口設(shè)計(jì)規(guī)范總結(jié)

restful接口設(shè)計(jì)規(guī)范總結(jié)

這篇 文章主要是借鑒他人,但是自己很想總結(jié)出一套規(guī)范嫡霞,以供向我這樣的新手使用,用來(lái)規(guī)范代碼希柿,如果有什么好的提議诊沪,請(qǐng)不吝賜教,本篇文章長(zhǎng)期更新曾撤!

一端姚、重要概念:

REST,即Representational State Transfer的縮寫(xiě)。我對(duì)這個(gè)詞組的翻譯是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"盾戴。

Resource(資源) :對(duì)象的單個(gè)實(shí)例寄锐。 例如,一只動(dòng)物尖啡。它可以是一段文本、一張圖片剩膘、一首歌曲衅斩、一種服務(wù),總之就是一個(gè)具體的實(shí)在怠褐。你可以用一個(gè)URI(統(tǒng)一資源定位符)指向它畏梆,每種資源對(duì)應(yīng)一個(gè)特定的URI。要獲取這個(gè)資源奈懒,訪問(wèn)它的URI就可以奠涌,因此URI就成了每一個(gè)資源的地址或獨(dú)一無(wú)二的識(shí)別符。

集合:對(duì)象的集合磷杏。 例如溜畅,動(dòng)物。

第三方:使用我們接口的開(kāi)發(fā)者

表現(xiàn)層(Representation)

"資源"是一種信息實(shí)體极祸,它可以有多種外在表現(xiàn)形式慈格。我們把"資源"具體呈現(xiàn)出來(lái)的形式怠晴,叫做它的"表現(xiàn)層"(Representation)。

狀態(tài)轉(zhuǎn)化(State Transfer)

訪問(wèn)一個(gè)網(wǎng)站浴捆,就代表了客戶(hù)端和服務(wù)器的一個(gè)互動(dòng)過(guò)程蒜田。在這個(gè)過(guò)程中,勢(shì)必涉及到數(shù)據(jù)和狀態(tài)的變化选泻〕逶粒互聯(lián)網(wǎng)通信協(xié)議HTTP協(xié)議,是一個(gè)無(wú)狀態(tài)協(xié)議页眯。這意味著色解,所有的狀態(tài)都保存在服務(wù)器端。因此餐茵,如果客戶(hù)端想要操作服務(wù)器科阎,必須通過(guò)某種手段,讓服務(wù)器端發(fā)生"狀態(tài)轉(zhuǎn)化"(State Transfer)忿族。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的锣笨,所以就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。

客戶(hù)端用到的手段道批,只能是HTTP協(xié)議错英。具體來(lái)說(shuō),就是HTTP協(xié)議里面隆豹,四個(gè)表示操作方式的動(dòng)詞:GET椭岩、POST、PUT璃赡、DELETE判哥。它們分別對(duì)應(yīng)四種基本操作:GET用來(lái)獲取資源,POST用來(lái)新建資源(也可以用于更新資源)碉考,PUT用來(lái)更新資源塌计,DELETE用來(lái)刪除資源。

比如侯谁,文本可以用txt格式表現(xiàn)锌仅,也可以用HTML格式、XML格式墙贱、JSON格式表現(xiàn)热芹,甚至可以采用二進(jìn)制格式;圖片可以用JPG格式表現(xiàn)惨撇,也可以用PNG格式表現(xiàn)伊脓。

URI只代表資源的實(shí)體,不代表它的形式串纺。嚴(yán)格地說(shuō)丽旅,有些網(wǎng)址最后的".html"后綴名是不必要的椰棘,因?yàn)檫@個(gè)后綴名表示格式,屬于"表現(xiàn)層"范疇榄笙,而URI應(yīng)該只代表"資源"的位置邪狞。它的具體表現(xiàn)形式,應(yīng)該在HTTP請(qǐng)求的頭信息中用Accept和Content-Type字段指定茅撞,這兩個(gè)字段才是對(duì)"表現(xiàn)層"的描述帆卓。

綜合上面的解釋?zhuān)覀兛偨Y(jié)一下什么是RESTful架構(gòu):

(1)每一個(gè)URI代表一種資源;

(2)客戶(hù)端和服務(wù)器之間米丘,傳遞這種資源的某種表現(xiàn)層剑令;

(3)客戶(hù)端通過(guò)四個(gè)HTTP動(dòng)詞,對(duì)服務(wù)器端資源進(jìn)行操作拄查,實(shí)現(xiàn)"表現(xiàn)層狀態(tài)轉(zhuǎn)化"吁津。

二、REST接口規(guī)范

1堕扶、動(dòng)作

GET (SELECT):從服務(wù)器檢索特定資源碍脏,或資源列表。
POST (CREATE):在服務(wù)器上創(chuàng)建一個(gè)新的資源稍算。
PUT (UPDATE):更新服務(wù)器上的資源典尾,提供整個(gè)資源。
PATCH (UPDATE):更新服務(wù)器上的資源糊探,僅提供更改的屬性钾埂。
DELETE (DELETE):從服務(wù)器刪除資源。

首先是四個(gè)半種動(dòng)作:
post科平、delete褥紫、put/patch、get
因?yàn)閜ut/patch只能算作一類(lèi)匠抗,所以將patch歸為半個(gè)故源。

另外還有有兩個(gè)較少知名的HTTP動(dòng)詞:
HEAD - 檢索有關(guān)資源的元數(shù)據(jù),例如數(shù)據(jù)的哈瞎常或上次更新時(shí)間。
OPTIONS - 檢索關(guān)于客戶(hù)端被允許對(duì)資源做什么的信息印机。

2矢腻、路徑(接口命名)

路徑又稱(chēng)"終點(diǎn)"(endpoint),表示API的具體網(wǎng)址射赛。

在RESTful架構(gòu)中多柑,每個(gè)網(wǎng)址代表一種資源(resource),所以網(wǎng)址中不能有動(dòng)詞楣责,只能有名詞竣灌,而且所用的名詞往往與數(shù)據(jù)庫(kù)的表格名對(duì)應(yīng)聂沙。一般來(lái)說(shuō),數(shù)據(jù)庫(kù)中的表都是同種記錄的"集合"(collection)初嘹,所以API中的名詞也應(yīng)該使用復(fù)數(shù)及汉。

舉例來(lái)說(shuō),有一個(gè)API提供動(dòng)物園(zoo)的信息屯烦,還包括各種動(dòng)物和雇員的信息坷随,則它的路徑應(yīng)該設(shè)計(jì)成下面這樣。

接口盡量使用名詞驻龟,禁止使用動(dòng)詞温眉,下面是一些例子。

GET         /zoos:列出所有動(dòng)物園
POST        /zoos:新建一個(gè)動(dòng)物園
GET         /zoos/ID:獲取某個(gè)指定動(dòng)物園的信息
PUT         /zoos/ID:更新某個(gè)指定動(dòng)物園的信息(提供該動(dòng)物園的全部信息)
PATCH       /zoos/ID:更新某個(gè)指定動(dòng)物園的信息(提供該動(dòng)物園的部分信息)
DELETE      /zoos/ID:刪除某個(gè)動(dòng)物園
GET         /zoos/ID/animals:列出某個(gè)指定動(dòng)物園的所有動(dòng)物
DELETE      /zoos/ID/animals/ID:刪除某個(gè)指定動(dòng)物園的指定動(dòng)物

反例:

/getAllCars
/createNewCar
/deleteAllRedCars

再比如翁狐,某個(gè)URI是/posts/show/1类溢,其中show是動(dòng)詞,這個(gè)URI就設(shè)計(jì)錯(cuò)了露懒,正確的寫(xiě)法應(yīng)該是/posts/1闯冷,然后用GET方法表示show。

如果某些動(dòng)作是HTTP動(dòng)詞表示不了的隐锭,你就應(yīng)該把動(dòng)作做成一種資源窃躲。比如網(wǎng)上匯款,從賬戶(hù)1向賬戶(hù)2匯款500元钦睡,錯(cuò)誤的URI是:

POST /accounts/1/transfer/500/to/2

正確的寫(xiě)法是把動(dòng)詞transfer改成名詞transaction蒂窒,資源不能是動(dòng)詞,但是可以是一種服務(wù):

POST /transaction HTTP/1.1
  Host: 127.0.0.1
  from=1&to=2&amount=500.00

理清資源的層次結(jié)構(gòu)荞怒,比如業(yè)務(wù)針對(duì)的范圍是學(xué)校洒琢,那么學(xué)校會(huì)是一級(jí)資源(/school),老師(/school/teachers)褐桌,學(xué)生(/school/students)就是二級(jí)資源衰抑。

3、版本(Versioning)

應(yīng)該將API的版本號(hào)放入U(xiǎn)RL荧嵌。如:

https://api.example.com/v1/

另一種做法是呛踊,將版本號(hào)放在HTTP頭信息中,但不如放入U(xiǎn)RL方便和直觀啦撮。Github采用這種做法谭网。

4、過(guò)濾信息(Filtering)

如果記錄數(shù)量很多赃春,服務(wù)器不可能都將它們返回給用戶(hù)愉择。API應(yīng)該提供參數(shù),過(guò)濾返回結(jié)果。
下面是一些常見(jiàn)的參數(shù)锥涕。

?limit=10:指定返回記錄的數(shù)量
?offset=10:指定返回記錄的開(kāi)始位置衷戈。
?page_number=2&page_size=100:指定第幾頁(yè),以及每頁(yè)的記錄數(shù)层坠。
?sortby=name&order=asc:指定返回結(jié)果按照哪個(gè)屬性排序殖妇,以及排序順序。
?animal_type_id=1:指定篩選條件
參數(shù)的設(shè)計(jì)允許存在冗余窿春,即允許API路徑和URL參數(shù)偶爾有重復(fù)拉一。比如,
GET /zoo/ID/animals 與 GET /animals?zoo_id=ID 的含義是相同的旧乞。

5蔚润、狀態(tài)碼(Status Codes)

狀態(tài)碼范圍

1xx 信息,請(qǐng)求收到尺栖,繼續(xù)處理嫡纠。范圍保留用于底層HTTP的東西,你很可能永遠(yuǎn)也用不到延赌。
2xx 成功除盏,行為被成功地接受、理解和采納
3xx 重定向挫以,為了完成請(qǐng)求者蠕,必須進(jìn)一步執(zhí)行的動(dòng)作
4xx 客戶(hù)端錯(cuò)誤,請(qǐng)求包含語(yǔ)法錯(cuò)誤或者請(qǐng)求無(wú)法實(shí)現(xiàn)掐松。范圍保留用于響應(yīng)客戶(hù)端做出的錯(cuò)誤踱侣,例如。他們提供不良數(shù)據(jù)或要求不存在的東西大磺。這些請(qǐng)求應(yīng)該是冪等的抡句,而不是更改服務(wù)器的狀態(tài)。
5xx 范圍的狀態(tài)碼是保留給服務(wù)器端錯(cuò)誤用的杠愧。這些錯(cuò)誤常常是從底層的函數(shù)拋出來(lái)的待榔,甚至
開(kāi)發(fā)人員也通常沒(méi)法處理,發(fā)送這類(lèi)狀態(tài)碼的目的以確绷骷茫客戶(hù)端獲得某種響應(yīng)锐锣。
當(dāng)收到5xx響應(yīng)時(shí),客戶(hù)端不可能知道服務(wù)器的狀態(tài)绳瘟,所以這類(lèi)狀態(tài)碼是要盡可能的避免刺下。

服務(wù)器向用戶(hù)返回的狀態(tài)碼和提示信息,常見(jiàn)的有以下一些(方括號(hào)中是該狀態(tài)碼對(duì)應(yīng)的HTTP動(dòng)詞)稽荧。

200 OK - [GET]:服務(wù)器成功返回用戶(hù)請(qǐng)求的數(shù)據(jù),該操作是冪等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用戶(hù)新建或修改數(shù)據(jù)成功姨丈。
202 Accepted - [*]:表示一個(gè)請(qǐng)求已經(jīng)進(jìn)入后臺(tái)排隊(duì)(異步任務(wù))
204 NO CONTENT - [DELETE]:用戶(hù)刪除數(shù)據(jù)成功畅卓。
400 INVALID REQUEST - [POST/PUT/PATCH]:用戶(hù)發(fā)出的請(qǐng)求有錯(cuò)誤,服務(wù)器沒(méi)有進(jìn)行新建或修改數(shù)據(jù)的操作蟋恬,該操作是冪等的翁潘。
401 Unauthorized - [*]:表示用戶(hù)沒(méi)有權(quán)限(令牌、用戶(hù)名歼争、密碼錯(cuò)誤)拜马。
403 Forbidden - [*] 表示用戶(hù)得到授權(quán)(與401錯(cuò)誤相對(duì)),但是訪問(wèn)是被禁止的沐绒。
404 NOT FOUND - [*]:用戶(hù)發(fā)出的請(qǐng)求針對(duì)的是不存在的記錄俩莽,服務(wù)器沒(méi)有進(jìn)行操作,該操作是冪等的乔遮。
406 Not Acceptable - [GET]:用戶(hù)請(qǐng)求的格式不可得(比如用戶(hù)請(qǐng)求JSON格式扮超,但是只有XML格式)。
410 Gone -[GET]:用戶(hù)請(qǐng)求的資源被永久刪除蹋肮,且不會(huì)再得到的出刷。
422 Unprocesable entity - [POST/PUT/PATCH] 當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),發(fā)生一個(gè)驗(yàn)證錯(cuò)誤坯辩。
500 INTERNAL SERVER ERROR - [*]:服務(wù)器發(fā)生錯(cuò)誤馁龟,用戶(hù)將無(wú)法判斷發(fā)出的請(qǐng)求是否成功。
502 網(wǎng)關(guān)錯(cuò)誤
503 Service Unavailable
504 網(wǎng)關(guān)超時(shí)

參考資料:

RESTful API 設(shè)計(jì)指南--阮一峰:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末漆魔,一起剝皮案震驚了整個(gè)濱河市坷檩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌有送,老刑警劉巖淌喻,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異雀摘,居然都是意外死亡裸删,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)阵赠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涯塔,“玉大人,你說(shuō)我怎么就攤上這事清蚀∝拜” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵枷邪,是天一觀的道長(zhǎng)榛搔。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么践惑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任腹泌,我火速辦了婚禮,結(jié)果婚禮上尔觉,老公的妹妹穿的比我還像新娘凉袱。我一直安慰自己,他們只是感情好侦铜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布专甩。 她就那樣靜靜地躺著,像睡著了一般钉稍。 火紅的嫁衣襯著肌膚如雪涤躲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天嫁盲,我揣著相機(jī)與錄音篓叶,去河邊找鬼。 笑死羞秤,一個(gè)胖子當(dāng)著我的面吹牛缸托,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘾蛋,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俐镐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哺哼?” 一聲冷哼從身側(cè)響起佩抹,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎取董,沒(méi)想到半個(gè)月后棍苹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茵汰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年枢里,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹂午。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栏豺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豆胸,到底是詐尸還是另有隱情奥洼,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布晚胡,位于F島的核電站灵奖,受9級(jí)特大地震影響嚼沿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桑寨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一伏尼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尉尾,春花似錦、人聲如沸燥透。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)班套。三九已至肢藐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吱韭,已是汗流浹背吆豹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留理盆,地道東北人痘煤。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猿规,于是被迫代替她去往敵國(guó)和親衷快。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 這篇 文章主要是借鑒他人姨俩,但是自己很想總結(jié)出一套規(guī)范蘸拔,以供向我這樣的新手使用,用來(lái)規(guī)范代碼环葵,如果有什么好的提議调窍,請(qǐng)...
    alterem閱讀 351評(píng)論 0 0
  • 一說(shuō)到REST,我想大家的第一反應(yīng)就是“啊张遭,就是那種前后臺(tái)通信方式邓萨。”但是在要求詳細(xì)講述它所提出的各個(gè)約束帝璧,以及如...
    時(shí)待吾閱讀 3,430評(píng)論 0 19
  • 總方針 構(gòu)建易于理解和使用的RESTful接口先誉。 接口應(yīng)該是直觀的,調(diào)用者可以通過(guò)接口來(lái)獲得系統(tǒng)或應(yīng)用程序中所有業(yè)...
    nikytwo閱讀 2,004評(píng)論 0 3
  • 一的烁、什么是API褐耳? API(Application Programming Interface,應(yīng)用程序編程接口)...
    Fairy_妍閱讀 62,617評(píng)論 2 42
  • UI動(dòng)畫(huà)VS微交互貌似都是一個(gè)東西? 說(shuō)起UI/UX設(shè)計(jì)渴庆,微交互是成敗與否的關(guān)鍵要素之一铃芦,是小小細(xì)節(jié)帶來(lái)巨大回報(bào)的...
    戰(zhàn)敭閱讀 537評(píng)論 0 5