Spring+SpringMVC+MyBatis+easyUI整合進(jìn)階篇(一)設(shè)計(jì)一套好的RESTful API

寫(xiě)在前面的話

看了一下博客目錄,距離上次更新這個(gè)系列的博文已經(jīng)有兩個(gè)多月,并不是因?yàn)椴幌肜^續(xù)寫(xiě)博客龟虎,由于中間這段時(shí)間更新了幾篇其他系列的文章就暫時(shí)停止了,如今已經(jīng)講述的差不多沙庐,也就繼續(xù)抽時(shí)間更新《Spring+SpringMVC+MyBatis+easyUI整合》這個(gè)系列了鲤妥。

github

也看到github上有人催更教程,這個(gè)真的是沒(méi)想到轨功,也謝謝你們的肯定和支持了。

由于《整合優(yōu)化篇》中關(guān)于代碼優(yōu)化及數(shù)據(jù)層優(yōu)化的文章占了較大的篇幅容达,導(dǎo)致遺漏了幾篇原計(jì)劃要更新在《整合優(yōu)化篇》中的文章古涧,關(guān)于RESTful的改造和緩存功能的整合并沒(méi)有做,這段時(shí)間會(huì)補(bǔ)充進(jìn)來(lái)花盐。

理解RESTful

REST(Representational State Transfer),中文翻譯叫"表述性狀態(tài)轉(zhuǎn)移",它首次出現(xiàn)在2000年Roy Fielding的博士論文中羡滑,Roy Fielding是 HTTP 規(guī)范的主要編寫(xiě)者之一菇爪。他在論文中提到:"我這篇文章的寫(xiě)作目的,就是想在符合架構(gòu)原理的前提下柒昏,理解和評(píng)估以網(wǎng)絡(luò)為基礎(chǔ)的應(yīng)用軟件的架構(gòu)設(shè)計(jì)凳宙,得到一個(gè)功能強(qiáng)、性能好职祷、適宜通信的架構(gòu)氏涩。REST指的是一組架構(gòu)約束條件和原則。"如果一個(gè)架構(gòu)符合REST的約束條件和原則有梆,我們就稱它為RESTful架構(gòu)是尖,REST其實(shí)并沒(méi)有創(chuàng)造新的技術(shù)、組件或服務(wù)泥耀,在我的理解中饺汹,它更應(yīng)該是一種理念、一種思想痰催,利用Web的現(xiàn)有特征和能力兜辞,更好地詮釋和體現(xiàn)現(xiàn)有Web標(biāo)準(zhǔn)中的一些準(zhǔn)則和約束。

看完這段理論性的介紹可能并不會(huì)使你對(duì)于RESTful有任何的想法夸溶,甚至只是一掃而過(guò)逸吵,那就通過(guò)實(shí)際的案例來(lái)講解吧。

ssm項(xiàng)目中有文章管理這個(gè)模塊蜘醋,文章列表頁(yè)面刪除文章請(qǐng)求的服務(wù)端API地址為:
http://ssm-demo.hanshuai.xin/article/delete.do,
這個(gè)URL并不是RESTful風(fēng)格的API胁塞,稍加修改,URL變成:
http://ssm-demo.hanshuai.xin/article/delete/12,
這樣是不是就是RESTful風(fēng)格了压语?

首先啸罢,這兩個(gè)URL都不是RESTful API,因?yàn)檫@兩個(gè)URL中都有delete的動(dòng)作指示胎食,RESTful API是面向資源的架構(gòu)扰才,因此其URL就應(yīng)該是一個(gè)資源,而且不應(yīng)該包含任何動(dòng)作厕怜,對(duì)于資源的具體操作類型應(yīng)該由HTTP動(dòng)詞表示衩匣,而不應(yīng)該是動(dòng)詞存在于URL中,delete是一個(gè)動(dòng)詞粥航,因此不符合該特點(diǎn)琅捏,對(duì)于文章刪除功能其對(duì)應(yīng)的RESTful API應(yīng)該是:
[DELETE] http://ssm-demo.hanshuai.xin/articles/12

常見(jiàn)的RESTful誤區(qū)

再講一下一開(kāi)始接觸RESTful時(shí)大家都可能存在的誤區(qū):

  • 一些偽靜態(tài)的URL,如http://ssm-demo.hanshuai.xin/contents/12,我們可以通過(guò)瀏覽器訪問(wèn)該URL而獲取信息递雀,但是這并不代表著它就是RESTful API柄延。
  • URL里含有queryString就不是RESTful Api,如http://ssm-demo.hanshuai.xin/articles/?page=1&rows=10缀程,RESTful API可以包含queryString搜吧。
  • HTTP + JSON = RESTful API,HTTP和JSON不等于RESTful市俊,RESTful特性更加豐富,不能將RESTful簡(jiǎn)單的等同于HTTP和JSON滤奈。

<h1>良好RESTful API的設(shè)計(jì)原則</h1>

關(guān)于RESTful API設(shè)計(jì)的具體實(shí)現(xiàn)可以到我的GitHub中查看摆昧,以下為整理的一些設(shè)計(jì)原則:

基本原則一:URI

  • 應(yīng)該將API部署在專用域名之下:ssm-demo.hanshuai.xin;
  • URL中盡量不用大寫(xiě);
  • URI中不應(yīng)該出現(xiàn)動(dòng)詞,動(dòng)詞應(yīng)該使用HTTP方法表示但是如果無(wú)法表示,也可使用動(dòng)詞,例如:search沒(méi)有對(duì)應(yīng)的HTTP方法,可以在路徑中使用search,更加直觀;
  • URI中的名詞表示資源集合,使用復(fù)數(shù)形式;
  • URI可以包含queryString,避免層級(jí)過(guò)深蜒程。

基本原則二:HTTP動(dòng)詞

對(duì)于資源的具體操作類型绅你,由HTTP動(dòng)詞表示,常用的HTTP動(dòng)詞有下面五個(gè):

  • GET:從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))搞糕。
  • POST:在服務(wù)器新建一個(gè)資源勇吊。
  • PUT:在服務(wù)器更新資源(客戶端提供改變后的完整資源)。
  • PATCH:在服務(wù)器更新資源(客戶端提供改變的屬性)窍仰。
  • DELETE:從服務(wù)器刪除資源汉规。

還有兩個(gè)不常用的HTTP動(dòng)詞:

  • HEAD:獲取資源的元數(shù)據(jù)。
  • OPTIONS:獲取信息驹吮,關(guān)于資源的哪些屬性是客戶端可以改變的针史。

例子:

文章管理模塊:

1. [POST]   http://ssm-demo.hanshuai.xin/articles   // 新增
2. [GET]    http://ssm-demo.hanshuai.xin/articles?page=1&rows=10 // 列表查詢
3. [PUT]    http://ssm-demo.hanshuai.xin/articles/12 // 修改
4. [DELETE] http://ssm-demo.hanshuai.xin/articles/12 // 刪除

基本原則三:狀態(tài)碼(Status Codes)

處理請(qǐng)求后,服務(wù)端需向客戶端返回的狀態(tài)碼和提示信息碟狞。

常見(jiàn)狀態(tài)碼(狀態(tài)碼可自行設(shè)計(jì)啄枕,只需開(kāi)發(fā)者約定好規(guī)范即可)

  • 200:SUCCESS,請(qǐng)求成功;
  • 401:Unauthorized,無(wú)權(quán)限;
  • 403:Forbidden,禁止訪問(wèn);
  • 410:Gone,無(wú)此資源;
  • 500:INTERNAL SERVER ERROR,服務(wù)器發(fā)生錯(cuò)誤。
    ...

基本原則四:錯(cuò)誤處理

如果服務(wù)器發(fā)生錯(cuò)誤或者資源不可達(dá)族沃,應(yīng)該向用戶返回出錯(cuò)信息频祝。

基本原則五:服務(wù)端數(shù)據(jù)返回

后端的返回結(jié)果最好使用JSON格式。

基本原則六:版本控制

  • 規(guī)范的API應(yīng)該包含版本信息脆淹,在RESTful API中常空,最簡(jiǎn)單的包含版本的方法是將版本信息放到url中,如:
[GET]    http://ssm-demo.hanshuai.xin/v1/articles?page=1&rows=10 
[PUT]    http://ssm-demo.hanshuai.xin/v1/articles/12 
  • 另一種做法是盖溺,使用HTTP header中的accept來(lái)傳遞版本信息漓糙。

ssm項(xiàng)目較為簡(jiǎn)單,因此暫時(shí)沒(méi)有加入版本信息烘嘱。

以下為參考內(nèi)容昆禽,借鑒了一位博主關(guān)于安全原則的整理:

安全原則一:Authentication和Permission

Authentication指用戶認(rèn)證,Permission指權(quán)限機(jī)制蝇庭,這兩點(diǎn)是使RESTful API強(qiáng)大醉鳖、靈活和安全的基本保障。

常用的認(rèn)證機(jī)制是Basic Auth和OAuth哮内,RESTful API開(kāi)發(fā)中盗棵,除非API非常簡(jiǎn)單,且沒(méi)有潛在的安全性問(wèn)題,否則漾根,認(rèn)證機(jī)制是必須實(shí)現(xiàn)的,并應(yīng)用到API中去鲫竞。Basic Auth非常簡(jiǎn)單辐怕,很多框架都集成了Basic Auth的實(shí)現(xiàn),自己寫(xiě)一個(gè)也能很快搞定从绘,OAuth目前已經(jīng)成為企業(yè)級(jí)服務(wù)的標(biāo)配寄疏,其相關(guān)的開(kāi)源實(shí)現(xiàn)方案非常豐富(更多)。

安全原則二:CORS

CORS即Cross-origin resource sharing僵井,在RESTful API開(kāi)發(fā)中陕截,主要是為js服務(wù)的,解決javascript調(diào)用RESTful API時(shí)的跨域問(wèn)題批什。

由于固有的安全機(jī)制农曲,js的跨域請(qǐng)求時(shí)是無(wú)法被服務(wù)器成功響應(yīng)的。現(xiàn)在前后端分離日益成為web開(kāi)發(fā)主流方式的大趨勢(shì)下驻债,后臺(tái)逐漸趨向指提供API服務(wù)乳规,為各客戶端提供數(shù)據(jù)及相關(guān)操作,而網(wǎng)站的開(kāi)發(fā)全部交給前端搞定合呐,網(wǎng)站和API服務(wù)很少部署在同一臺(tái)服務(wù)器上并使用相同的端口暮的,js的跨域請(qǐng)求時(shí)普遍存在的,開(kāi)發(fā)RESTful API時(shí)淌实,通常都要考慮到CORS功能的實(shí)現(xiàn)冻辩,以便js能正常使用API。

目前各主流web開(kāi)發(fā)語(yǔ)言都有很多優(yōu)秀的實(shí)現(xiàn)CORS的開(kāi)源庫(kù)拆祈,我們?cè)陂_(kāi)發(fā)RESTful API時(shí)恨闪,要注意CORS功能的實(shí)現(xiàn),直接拿現(xiàn)有的輪子來(lái)用即可缘屹。

安全原則三:SSL

http改為https凛剥,增強(qiáng)安全驗(yàn)證。

總結(jié)

i'm back

以上做了一些簡(jiǎn)單的總結(jié)轻姿,可能并不是十分的準(zhǔn)確犁珠,如有錯(cuò)誤,希望能夠指出我會(huì)及時(shí)修改互亮,謝謝了犁享。

首發(fā)于我的個(gè)人博客,新的項(xiàng)目演示地址:perfect-ssm豹休。

如果有問(wèn)題或者有一些好的創(chuàng)意炊昆,歡迎給我留言,也感謝向我指出項(xiàng)目中存在問(wèn)題的朋友,具體的功能實(shí)現(xiàn)及代碼邏輯將在之后的文章中介紹凤巨。

如果你想繼續(xù)了解該項(xiàng)目可以查看整個(gè)系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub倉(cāng)庫(kù)或者開(kāi)源中國(guó)代碼倉(cāng)庫(kù)中查看源碼及項(xiàng)目文檔视乐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敢茁,隨后出現(xiàn)的幾起案子佑淀,更是在濱河造成了極大的恐慌,老刑警劉巖彰檬,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伸刃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逢倍,警方通過(guò)查閱死者的電腦和手機(jī)捧颅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)较雕,“玉大人碉哑,你說(shuō)我怎么就攤上這事×两” “怎么了谭梗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宛蚓。 經(jīng)常有香客問(wèn)我激捏,道長(zhǎng),這世上最難降的妖魔是什么凄吏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任远舅,我火速辦了婚禮,結(jié)果婚禮上痕钢,老公的妹妹穿的比我還像新娘图柏。我一直安慰自己,他們只是感情好任连,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布蚤吹。 她就那樣靜靜地躺著,像睡著了一般随抠。 火紅的嫁衣襯著肌膚如雪裁着。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天拱她,我揣著相機(jī)與錄音二驰,去河邊找鬼。 笑死秉沼,一個(gè)胖子當(dāng)著我的面吹牛桶雀,可吹牛的內(nèi)容都是我干的矿酵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矗积,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼全肮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起棘捣,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倔矾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后柱锹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丰包,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年禁熏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邑彪。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞧毙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寄症,到底是詐尸還是另有隱情宙彪,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布有巧,位于F島的核電站释漆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篮迎。R本人自食惡果不足惜男图,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甜橱。 院中可真熱鬧逊笆,春花似錦、人聲如沸岂傲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镊掖。三九已至乃戈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亩进,已是汗流浹背偏化。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人差油。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像的止,于是被迫代替她去往敵國(guó)和親韵卤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骗污,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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