Restful API 的設(shè)計(jì)規(guī)范

轉(zhuǎn)自:http://blog.csdn.net/yue7603835/article/details/52536497

URI

URI (Uniform Resource Identifier渠啤,統(tǒng)一資源標(biāo)識(shí)符)堤框,資源一般對(duì)應(yīng)服務(wù)器端領(lǐng)域模型中的實(shí)體類溉愁。

URI規(guī)范
  1. 不用大寫(xiě);
  2. 用中杠-不用下杠_;
  3. 參數(shù)列表要encode;
  4. URI中的名詞表示資源集合傻丝,使用復(fù)數(shù)形式葫男。
資源集合 vs 單個(gè)資源

URI表示資源的兩種方式:資源集合翅萤、單個(gè)資源窒盐。

  1. 資源集合:
/zoos //所有動(dòng)物園
/zoos/1/animals //id為1的動(dòng)物園中的所有動(dòng)物
  1. 單個(gè)資源:
/zoos/1 //id為1的動(dòng)物園
/zoos/1;2;3 //id為1啃奴,2潭陪,3的動(dòng)物園
避免層級(jí)過(guò)深的URI

/在uri中表達(dá)層級(jí),用于按實(shí)體關(guān)聯(lián)關(guān)系進(jìn)行對(duì)象導(dǎo)航最蕾,一般根據(jù)id導(dǎo)航依溯。
過(guò)深的導(dǎo)航容易導(dǎo)致uri膨脹,不易維護(hù)瘟则,如:
GET /zoos/1/areas/3/animals/4黎炉。
盡量使用查詢參數(shù)代替路徑中的實(shí)體導(dǎo)航,如:
GET /animals?zoo=1&area=3醋拧;

對(duì)Composite資源的訪問(wèn)

服務(wù)器端的組合實(shí)體必須在uri中通過(guò)父實(shí)體的id導(dǎo)航訪問(wèn)慷嗜。
組合實(shí)體不是first-class的實(shí)體,它的生命周期完全依賴父實(shí)體丹壕,它是無(wú)法獨(dú)立存在的庆械,在實(shí)現(xiàn)上通常是對(duì)數(shù)據(jù)庫(kù)表中某些列的抽象,不直接對(duì)應(yīng)表菌赖,也無(wú)id缭乘。一個(gè)常見(jiàn)的例子是 User — AddressAddress是對(duì)User表中zipCode盏袄,country忿峻,city三個(gè)字段的簡(jiǎn)單抽象薄啥,無(wú)法獨(dú)立于User存在辕羽。必須通過(guò)User索引到Address

GET /user/1/addresses    //id為1的用戶的地址

Request

HTTP方法

通過(guò)標(biāo)準(zhǔn)HTTP方法對(duì)資源CRUD:
GET:查詢

GET /zoos    //查詢所有動(dòng)物園
GET /zoos/1    //查詢id為1的動(dòng)物園
GET /zoos/1/employees    //查詢id為1的動(dòng)物園的所有員工
GET /zoos/1/employees/1    //查詢id為1的動(dòng)物園的1號(hào)員工

POST:創(chuàng)建單個(gè)資源。POST一般向“資源集合”型uri發(fā)起

POST /animals  //新增動(dòng)物
POST /zoos/1/employees //為id為1的動(dòng)物園雇傭員工

PUT:更新單個(gè)資源(全量)垄惧,客戶端提供完整的更新后的資源刁愿。與之對(duì)應(yīng)的是 PATCH,PATCH 負(fù)責(zé)部分更新到逊,客戶端提供要更新的那些字段铣口。PUT/PATCH一般向“單個(gè)資源”型uri發(fā)起

PUT /animals/1
PUT /zoos/1

DELETE:刪除

DELETE /zoos/1/employees/2    //刪除id為1的動(dòng)物園的2號(hào)員工
DELETE /zoos/1/employees/2;4;5    //刪除id為1的動(dòng)物園的2,4,5號(hào)員工
DELETE /zoos/1/animals  //刪除id為1的動(dòng)物園內(nèi)的所有動(dòng)物

安全性和冪等性

安全性:不會(huì)改變資源狀態(tài),可以理解為只讀的觉壶;
冪等性:執(zhí)行1次和執(zhí)行N次脑题,對(duì)資源狀態(tài)改變的效果是等價(jià)的。

安全性 冪等性
get
post × ×
put ×
delete ×

安全性和冪等性均不保證反復(fù)請(qǐng)求能拿到相同的response铜靶。以 DELETE 為例叔遂,第一次DELETE返回200表示刪除成功,第二次返回404提示資源不存在,這是允許的已艰。

復(fù)雜查詢

查詢可以捎帶以下參數(shù):

實(shí)例 備注
過(guò)濾條件 ?type=1&age=16 允許一定的uri冗余痊末,如/zoos/1與/zoos?id=1
排序 ?sort=age,desc
投影 ?whitelist=id,name,email
分頁(yè) ?limit=10&offset=3
Format

只用以下常見(jiàn)的3種body format:

  1. Content-Type: application/json;spring mvc用@RequestBody解析成對(duì)象
POST /v1/animal HTTP/1.1
Host: api.example.org
Accept: application/json
Content-Type: application/json
Content-Length: 24

{
  "name": "Gir",
  "animalType": "12"
}
  1. Content-Type: application/x-www-form-urlencoded (瀏覽器POST表單用的格式哩掺,@RequestBody不能解析)
POST /login HTTP/1.1
Host: example.com
Content-Length: 31
Accept: text/html
Content-Type: application/x-www-form-urlencoded

username=root&password=Zion0101
  1. multipart/form-data; boundary=----WebKitFormBoundaryITio08aDVqufJd9L(表單有文件上傳時(shí)的格式)
Content Negotiation

資源可以有多種表示方式凿叠,如json、xml嚼吞、pdf盒件、excel等等,客戶端可以指定自己期望的格式舱禽,通常有兩種方式:

  1. http header Accept:
    Accept:application/xml;q=0.6,application/atom+xml;q=1.0
  2. uri中加文件后綴
    /zoo/1.json

Response

  1. 不要包裝:
    response 的 body 直接就是數(shù)據(jù)履恩,不要做多余的包裝。錯(cuò)誤示例:
{
    "success":true,
    "data":{"id":1,"name":"xiaotuan"},
}

正確示例:

{
  "id":1,
  "name":"xiaotuan"
}
  1. 各HTTP方法成功處理后的數(shù)據(jù)格式
response 格式
GET 單個(gè)對(duì)象呢蔫、集合
POST 新增成功的對(duì)象
PUT/PATCH 更新成功的對(duì)象
DELETE
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末切心,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子片吊,更是在濱河造成了極大的恐慌绽昏,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俏脊,死亡現(xiàn)場(chǎng)離奇詭異全谤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)爷贫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門认然,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人漫萄,你說(shuō)我怎么就攤上這事卷员。” “怎么了腾务?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵毕骡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岩瘦,道長(zhǎng)未巫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任启昧,我火速辦了婚禮叙凡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘密末。我一直安慰自己握爷,他們只是感情好宰啦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著饼拍,像睡著了一般赡模。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上师抄,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天漓柑,我揣著相機(jī)與錄音,去河邊找鬼叨吮。 笑死辆布,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茶鉴。 我是一名探鬼主播锋玲,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涵叮!你這毒婦竟也來(lái)了惭蹂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤割粮,失蹤者是張志新(化名)和其女友劉穎盾碗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舀瓢,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廷雅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了京髓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片航缀。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖堰怨,靈堂內(nèi)的尸體忽然破棺而出芥玉,到底是詐尸還是另有隱情,我是刑警寧澤诚些,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布飞傀,位于F島的核電站皇型,受9級(jí)特大地震影響诬烹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弃鸦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一绞吁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唬格,春花似錦家破、人聲如沸颜说。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)门粪。三九已至,卻和暖如春烹困,著一層夾襖步出監(jiān)牢的瞬間玄妈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工髓梅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拟蜻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓枯饿,卻偏偏與公主長(zhǎng)得像酝锅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奢方,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高搔扁,建議使用雙通...
    有涯逐無(wú)涯閱讀 2,519評(píng)論 0 6
  • 原文鏈接:https://https://howardwchen.com/2017/09/18/talk-abou...
    守望者Howard閱讀 6,331評(píng)論 1 6
  • 翻譯約定 primary data: 主數(shù)據(jù)resource identifier object 資源標(biāo)識(shí)符對(duì)象r...
    sladeliu閱讀 2,374評(píng)論 0 2
  • 一說(shuō)到REST,我想大家的第一反應(yīng)就是“啊蟋字,就是那種前后臺(tái)通信方式阁谆。”但是在要求詳細(xì)講述它所提出的各個(gè)約束愉老,以及如...
    時(shí)待吾閱讀 3,410評(píng)論 0 19
  • 前言 好記性不如爛筆頭场绿,學(xué)習(xí)的知識(shí)總要記錄下來(lái),通過(guò)本文來(lái)加深對(duì) ViewPager 方方面面的理解: ViewP...
    whd_Alive閱讀 2,176評(píng)論 0 9