31. Restful API 設(shè)計介紹

Restful

2000年,Roy Thomas Fielding博士在他的博士論文《Architectural Styles and the Design of Network-based Software Architectures》中提出了幾種軟件應(yīng)用的架構(gòu)風(fēng)格,REST作為其中的一種架構(gòu)風(fēng)格在這篇論文中進行了概括性的介紹养交。

REST:Representational State Transfer的縮寫翠语,翻譯:“具象狀態(tài)傳輸”嚎杨。一般解釋為“表現(xiàn)層狀態(tài)轉(zhuǎn)換”座云。

REST是設(shè)計風(fēng)格而不是標(biāo)準(zhǔn)袒炉。是指客戶端和服務(wù)器的交互形式旁理。我們需要關(guān)注的重點是如何設(shè)計REST風(fēng)格的網(wǎng)絡(luò)接口。

  • REST的特點:
  • 具象的我磁。一般指表現(xiàn)層孽文,要表現(xiàn)的對象就是資源。比如夺艰,客戶端訪問服務(wù)器芋哭,獲取的數(shù)據(jù)就是資源。比如文字郁副、圖片减牺、音視頻等。
  • 表現(xiàn):資源的表現(xiàn)形式存谎。txt格式拔疚、html格式、json格式既荚、jpg格式等稚失。瀏覽器通過URL確定資源的位置,但是需要在HTTP請求頭中恰聘,用Accept和Content-Type字段指定句各,這兩個字段是對資源表現(xiàn)的描述。
  • 狀態(tài)轉(zhuǎn)換:客戶端和服務(wù)器交互的過程憨琳。在這個過程中诫钓,一定會有數(shù)據(jù)和狀態(tài)的轉(zhuǎn)化旬昭,這種轉(zhuǎn)化叫做狀態(tài)轉(zhuǎn)換篙螟。其中,GET表示獲取資源问拘,POST表示新建資源遍略,PUT表示更新資源惧所,DELETE表示刪除資源。HTTP協(xié)議中最常用的就是這四種操作方式绪杏。
    • RESTful架構(gòu):
    • 每個URL代表一種資源下愈;
    • 客戶端和服務(wù)器之間,傳遞這種資源的某種表現(xiàn)層蕾久;
    • 客戶端通過四個http動詞势似,對服務(wù)器資源進行操作,實現(xiàn)表現(xiàn)層狀態(tài)轉(zhuǎn)換僧著。

如何設(shè)計符合RESTful風(fēng)格的API:

一履因、域名:

將api部署在專用域名下:

http://api.example.com

或者將api放在主域名下:

http://www.example.com/api/

二、版本:

將API的版本號放在url中盹愚。

http://www.example.com/app/1.0/info
http://www.example.com/app/1.2/info

三栅迄、路徑:

路徑表示API的具體網(wǎng)址。每個網(wǎng)址代表一種資源皆怕。 資源作為網(wǎng)址毅舆,網(wǎng)址中不能有動詞只能有名詞,一般名詞要與數(shù)據(jù)庫的表名對應(yīng)愈腾。而且名詞要使用復(fù)數(shù)憋活。

錯誤示例:

http://www.example.com/getGoods
http://www.example.com/listOrders

正確示例:

#獲取單個商品
http://www.example.com/app/goods/1
#獲取所有商品
http://www.example.com/app/goods

四、使用標(biāo)準(zhǔn)的HTTP方法:

對于資源的具體操作類型顶滩,由HTTP動詞表示余掖。 常用的HTTP動詞有四個。

GET     SELECT :從服務(wù)器獲取資源礁鲁。
POST    CREATE :在服務(wù)器新建資源盐欺。
PUT     UPDATE :在服務(wù)器更新資源。
DELETE  DELETE :從服務(wù)器刪除資源仅醇。

示例:

#獲取指定商品的信息
GET http://www.example.com/goods/ID
#新建商品的信息
POST http://www.example.com/goods
#更新指定商品的信息
PUT http://www.example.com/goods/ID
#刪除指定商品的信息
DELETE http://www.example.com/goods/ID

五冗美、過濾信息:

如果資源數(shù)據(jù)較多,服務(wù)器不能將所有數(shù)據(jù)一次全部返回給客戶端析二。API應(yīng)該提供參數(shù)粉洼,過濾返回結(jié)果。 實例:

#指定返回數(shù)據(jù)的數(shù)量
http://www.example.com/goods?limit=10
#指定返回數(shù)據(jù)的開始位置
http://www.example.com/goods?offset=10
#指定第幾頁叶摄,以及每頁數(shù)據(jù)的數(shù)量
http://www.example.com/goods?page=2&per_page=20

六属韧、狀態(tài)碼:

服務(wù)器向用戶返回的狀態(tài)碼和提示信息,常用的有:

200 OK  :服務(wù)器成功返回用戶請求的數(shù)據(jù)
201 CREATED :用戶新建或修改數(shù)據(jù)成功蛤吓。
202 Accepted:表示請求已進入后臺排隊宵喂。
400 INVALID REQUEST :用戶發(fā)出的請求有錯誤。
401 Unauthorized :用戶沒有權(quán)限会傲。
403 Forbidden :訪問被禁止锅棕。
404 NOT FOUND :請求針對的是不存在的記錄拙泽。
406 Not Acceptable :用戶請求的的格式不正確。
500 INTERNAL SERVER ERROR :服務(wù)器發(fā)生錯誤裸燎。

七顾瞻、錯誤信息:

一般來說,服務(wù)器返回的錯誤信息德绿,以鍵值對的形式返回荷荤。

{
    error:'Invalid API KEY'
}

八、響應(yīng)結(jié)果:

針對不同結(jié)果移稳,服務(wù)器向客戶端返回的結(jié)果應(yīng)符合以下規(guī)范梅猿。

#返回商品列表
GET    http://www.example.com/goods
#返回單個商品
GET    http://www.example.com/goods/cup
#返回新生成的商品
POST   http://www.example.com/goods
#返回一個空文檔
DELETE http://www.example.com/goods

九、使用鏈接關(guān)聯(lián)相關(guān)的資源:

在返回響應(yīng)結(jié)果時提供鏈接其他API的方法秒裕,使客戶端很方便的獲取相關(guān)聯(lián)的信息袱蚓。

十、其他:

服務(wù)器返回的數(shù)據(jù)格式几蜻,應(yīng)該盡量使用JSON喇潘,避免使用XML。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梭稚,一起剝皮案震驚了整個濱河市颖低,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弧烤,老刑警劉巖忱屑,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暇昂,居然都是意外死亡莺戒,警方通過查閱死者的電腦和手機籽御,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門痴昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝎亚,你說我怎么就攤上這事澄暮∶危” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵泣懊,是天一觀的道長伸辟。 經(jīng)常有香客問我,道長馍刮,這世上最難降的妖魔是什么信夫? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上忙迁,老公的妹妹穿的比我還像新娘。我一直安慰自己碎乃,他們只是感情好姊扔,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梅誓,像睡著了一般恰梢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梗掰,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天嵌言,我揣著相機與錄音,去河邊找鬼及穗。 笑死摧茴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埂陆。 我是一名探鬼主播苛白,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焚虱!你這毒婦竟也來了购裙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鹃栽,失蹤者是張志新(化名)和其女友劉穎躏率,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體民鼓,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡薇芝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丰嘉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恩掷。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖供嚎,靈堂內(nèi)的尸體忽然破棺而出黄娘,到底是詐尸還是另有隱情,我是刑警寧澤克滴,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布逼争,位于F島的核電站,受9級特大地震影響劝赔,放射性物質(zhì)發(fā)生泄漏誓焦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杂伟。 院中可真熱鬧移层,春花似錦、人聲如沸赫粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽越平。三九已至频蛔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秦叛,已是汗流浹背晦溪。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挣跋,地道東北人三圆。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像避咆,于是被迫代替她去往敵國和親嫌术。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 去年有段時間得空牌借,就把谷歌GAE的API權(quán)威指南看了一遍度气,收獲頗豐,特別是在自己幾乎獨立開發(fā)了公司的云數(shù)據(jù)中心之后...
    騎單車的勛爵閱讀 20,444評論 0 41
  • 一說到REST膨报,我想大家的第一反應(yīng)就是“啊磷籍,就是那種前后臺通信方式∠帜”但是在要求詳細(xì)講述它所提出的各個約束院领,以及如...
    時待吾閱讀 3,410評論 0 19
  • API定義規(guī)范 本規(guī)范設(shè)計基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,519評論 0 6
  • 要說RESTful首先來說說REST – REpresentational State Transfer (表述性...
    趙客縵胡纓v吳鉤霜雪明閱讀 5,505評論 2 121
  • 本課內(nèi)容:重音與切 課后小問(拿這些問題做一個課后測試) 1.重音有規(guī)律嗎够吩?【重音之歌】的內(nèi)容是什么比然? 2.三個音...
    宋金豆閱讀 410評論 0 1