Restful API的設(shè)計(jì)與實(shí)踐

Restful這個(gè)名稱應(yīng)該很多人都不陌生娄帖,但是我發(fā)現(xiàn)不少人對(duì)Restful存在或多或少的理解偏差桐猬,其中不泛比較厲害的程序員冷离,所以有必要為Restful來(lái)“正名”挠说。

Restful是一種軟件架構(gòu)風(fēng)格辩诞,設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原則和約束條件纺涤。它主要用于客戶端和服務(wù)器交互類的軟件】偻基于這個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡(jiǎn)潔撩炊,更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制崎脉。(詳見百度百科介紹

Restful的關(guān)鍵是抽取資源拧咳,使用URL與資源進(jìn)行對(duì)應(yīng)。這邊也是多數(shù)人理解有偏差之處囚灼,即Restful應(yīng)該理解為面向資源的架構(gòu)風(fēng)格骆膝,URL的設(shè)計(jì)應(yīng)該是從資源的角度出發(fā)祭衩,而不應(yīng)有任何的“動(dòng)作”設(shè)計(jì),其中單個(gè)資源共享同一個(gè)接口阅签,而不同的“動(dòng)作”通過(guò)請(qǐng)求的方法進(jìn)行區(qū)分掐暮。這也是和RPC調(diào)用方式或RPC-Restful混合調(diào)用方式最大的不同之處。

<h4>那么為什么要使用Restful風(fēng)格政钟?有什么優(yōu)勢(shì)路克? </h4>
1、統(tǒng)一接口:約定大于配置养交,有了統(tǒng)一的規(guī)范精算,大家在接口設(shè)計(jì)時(shí)能夠保證理解的一致性,這樣首先便于接口的理解碎连。另外同一資源URL一致灰羽,不同的CURD操作通過(guò)不同的Http協(xié)議方法進(jìn)行區(qū)分,這樣在設(shè)計(jì)上做到了簡(jiǎn)化鱼辙。統(tǒng)一接口還有個(gè)非常容易被忽視的好處廉嚼,就是方便使用Http協(xié)議自帶的緩存機(jī)制對(duì)請(qǐng)求進(jìn)行緩存操作,這樣在一定程度上又提高了請(qǐng)求的性能座每。

2前鹅、無(wú)狀態(tài)性:由于使用Http協(xié)議進(jìn)行調(diào)用,每個(gè)請(qǐng)求都包含了服務(wù)器所需的全部信息峭梳,所以這種方式非常適用于異構(gòu)系統(tǒng)之間的調(diào)用舰绘,同時(shí)也良好地支持分布式架構(gòu),可以動(dòng)態(tài)地?cái)U(kuò)展服務(wù)器葱椭。這也是一個(gè)非常明顯的優(yōu)勢(shì)捂寿。

<h4>Restful風(fēng)格非常好,具體如何設(shè)計(jì)孵运?</h4>
1秦陋、提取資源: 這一步非常關(guān)鍵,也是Restful的核心思想所在治笨。在面向?qū)ο蟮氖澜缋锊蹈牛瑢?duì)于資源的識(shí)別不算太難,一般情況下資源即是想要處理的對(duì)象旷赖,如果對(duì)應(yīng)到表結(jié)構(gòu)上面顺又,可能就是表對(duì)應(yīng)的實(shí)體。例如電子商務(wù)網(wǎng)站上的下訂單等孵,那資源就是訂單稚照;如果是商品展示,那資源就是商品。當(dāng)然這是最簡(jiǎn)單的情況果录,如果稍微復(fù)雜一點(diǎn)上枕,比如現(xiàn)在是家電類的商品展示怎么辦呢?那資源就是商品-家電類弱恒。像上面所述的情況辨萍,資源比較好識(shí)別,而有些情況下資源就不是那么明顯了斤彼,比如登錄分瘦,這是哪門子資源?這種情況確實(shí)不太好抽象琉苇,不過(guò)可以理解為登錄信息資源嘲玫。登錄操作是對(duì)登錄信息資源的新增操作。還有其它更復(fù)雜的情況并扇,這個(gè)就得發(fā)揮面向資源的思路做進(jìn)一步的抽象了去团。

2、URI設(shè)計(jì): URI的設(shè)計(jì)其實(shí)與資源提取緊密相關(guān)穷蛹,基本只要資源提取出來(lái)了土陪,URI只是相應(yīng)地翻譯成地址就可以,有層級(jí)的資源通過(guò)分隔符進(jìn)行路徑區(qū)分肴熏。例如上面提到的商品展示可以是/goods鬼雀,家電類商品可以/goods/elecequipt/,而登錄可以是/loginInfo蛙吏。

3源哩、具體的動(dòng)作: 這個(gè)嚴(yán)格說(shuō)來(lái)并不是設(shè)計(jì)的一部分,是屬于規(guī)范的一部分鸦做。因?yàn)槭褂肏ttp協(xié)議励烦,而協(xié)議中正好有相應(yīng)的方法支持,所以正好使用Http協(xié)議的方法泼诱。(1)GET:獲取資源的方法坛掠;(2)PUT:更新資源的方法;(3)POST:創(chuàng)建資源的方法治筒;(4)DELETE:刪除資源的方法屉栓。這幾個(gè) 是比較常用的,還有幾個(gè)不太常用的方法:(5)OPTIONS:查看資源支持哪些方法耸袜;(6)HEAD:與PUT類似系瓢,只不過(guò)HEAD只返回報(bào)頭,不返回表示句灌。
這里需要著重提一下,很多Restful-RPC混合模式可能就只會(huì)使用POST方法,這里就是混合模式與Restful風(fēng)格最明顯的區(qū)別之一胰锌。

4骗绕、返回結(jié)果: 返回結(jié)果包括Http請(qǐng)求的狀態(tài)碼和資源的表述。很多情況下API的返回結(jié)果使用Json或者XML格式表示资昧,而Json是更加常用的酬土。因?yàn)镴son相比XML更加輕量,這樣在傳輸過(guò)程中資源更小傳輸更快格带,另外Json的解析支持更廣撤缴,所以解析起來(lái)非常方便。

5叽唱、緩存: Http協(xié)議是天然支持緩存的屈呕,這個(gè)也有利于性能的提升。當(dāng)然服務(wù)端也可以添加緩存提高性能棺亭,這是另一個(gè)話題虎眨。緩存具體的實(shí)現(xiàn)在Http Header里面進(jìn)行設(shè)置,例如Cache-Control镶摘、Expires嗽桩。具體用法可以參見協(xié)議頭描述:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

6、安全性: 如果資源是公開的凄敢,那也沒(méi)有什么安全性可言了碌冶。但是實(shí)際情況是很多資源是有對(duì)應(yīng)的“權(quán)限”進(jìn)行操作的,這個(gè)時(shí)候就需要進(jìn)行身份的認(rèn)證涝缝,認(rèn)證才能夠進(jìn)行相應(yīng)的操作扑庞。所以安全性也是設(shè)計(jì)中很重要的一環(huán)。
那么安全性如何保證呢俊卤?在Http協(xié)議中有Authorization頭可以進(jìn)行相關(guān)設(shè)置嫩挤,最基本的可以使用Basic方式,更加安全的加密方式使用Digest方式消恍,更進(jìn)一步提高安全性還可以使用第三方的OAuth協(xié)議進(jìn)行認(rèn)證岂昭,OAuth也是經(jīng)常采用的方式。具體使用可參考網(wǎng)上看到的一篇非常好的博文:理解OAuth2.0狠怨。另外為了安全性的保證约啊,大多數(shù)情況下還會(huì)選用https協(xié)議進(jìn)行傳輸。

<h4> 設(shè)計(jì)的思路有了佣赖,那么該如何付諸實(shí)踐恰矩? </h4>
1、使用場(chǎng)景: 前面也提到了憎蛤,Restful風(fēng)格特別適合于異構(gòu)系統(tǒng)之間的調(diào)用外傅,另外在分布式場(chǎng)景中也比較適用纪吮。比如現(xiàn)在移動(dòng)端APP的接口設(shè)計(jì)很多都采用這種風(fēng)格,另外有不少云平臺(tái)提供的服務(wù)接口也大多采用Restful風(fēng)格設(shè)計(jì)萎胰。使用還是比較廣泛的碾盟。

2、實(shí)踐示例: 說(shuō)了半天理論還是略顯空洞技竟,下面直接來(lái)點(diǎn)示例加深下理解冰肴。限于篇幅,這里推薦幾個(gè)看到的比較好的例子榔组。
簡(jiǎn)單情況下的使用示例可以參考網(wǎng)上看到的一篇非常好的博文:理解Restful架構(gòu)熙尉。
稍微復(fù)雜一點(diǎn)的情況可以考慮現(xiàn)在比較知名的云平臺(tái)的API設(shè)計(jì),比如百度云推送API設(shè)計(jì):http://push.baidu.com/doc/restapi/restapi搓扯。另外還推薦一個(gè)看到的Saas服務(wù)商的Restful設(shè)計(jì)文檔检痰,寫得很好,環(huán)信的聊天API設(shè)計(jì):http://docs.easemob.com/doku.php?id=start:100serverintegration擅编。
這邊有幾個(gè)有意思的地方可以特別關(guān)注下攀细,比如API中的安全認(rèn)證設(shè)計(jì)、接口輸入輸出設(shè)計(jì)爱态。另外如果看得仔細(xì)谭贪,可能會(huì)注意到百度云平臺(tái)推送平臺(tái)的API設(shè)計(jì)可能與前面提到的Restful本身的設(shè)計(jì)思路有些出入,百度云推送的設(shè)計(jì)方式嚴(yán)格說(shuō)來(lái)應(yīng)該算是Restful-Rpc混合模式的設(shè)計(jì)锦担。不過(guò)也不影響做為參考俭识。

3、框架支持: 這里以Java版本的為例洞渔。Java對(duì)于Restful有一個(gè)規(guī)范定義JAX-RS套媚,而支持Restful框架也不少,比如:Restlet磁椒、Jersey堤瘤、RESTEasyCXF浆熔。這幾個(gè)框架的比較可以參考這篇博文:http://www.infoq.com/cn/news/2008/10/jaxrs-comparison/本辐。我對(duì)Restlet和Jersey進(jìn)行了簡(jiǎn)單了解,沒(méi)有做深入的使用医增,覺(jué)得Restlet的文檔是做得更好的慎皱。
除了上面提到的框架,現(xiàn)在非常流行的Spring MVC框架也對(duì)Restful有良好的支持叶骨,比如可以參考這篇的實(shí)踐:http://www.importnew.com/7903.html茫多,Spring框架的支持還是非常不錯(cuò)的。

<h4>參考資料</h4>
1忽刽、《RESTful Java with JAX-RS 2.0》
2天揖、《RESTful Web APIs》
3夺欲、《RESTful Web Services Cookbook》中文版
4、《RESTful Web Services》中文版
5宝剖、《REST實(shí)戰(zhàn)》中文版
<h4></h4>
同步發(fā)表于CSDN博客:http://blog.csdn.net/qiubabin/article/details/50214811

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洁闰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子万细,更是在濱河造成了極大的恐慌,老刑警劉巖纸泄,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖钞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡聘裁,警方通過(guò)查閱死者的電腦和手機(jī)雪营,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衡便,“玉大人献起,你說(shuō)我怎么就攤上這事×蜕拢” “怎么了谴餐?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)呆抑。 經(jīng)常有香客問(wèn)我岂嗓,道長(zhǎng),這世上最難降的妖魔是什么鹊碍? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任厌殉,我火速辦了婚禮,結(jié)果婚禮上侈咕,老公的妹妹穿的比我還像新娘公罕。我一直安慰自己,他們只是感情好耀销,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布楼眷。 她就那樣靜靜地躺著,像睡著了一般树姨。 火紅的嫁衣襯著肌膚如雪摩桶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天帽揪,我揣著相機(jī)與錄音硝清,去河邊找鬼。 笑死转晰,一個(gè)胖子當(dāng)著我的面吹牛芦拿,可吹牛的內(nèi)容都是我干的士飒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蔗崎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酵幕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缓苛,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芳撒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后未桥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笔刹,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年冬耿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舌菜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亦镶,死狀恐怖日月,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缤骨,我是刑警寧澤爱咬,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站荷憋,受9級(jí)特大地震影響台颠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勒庄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一串前、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧实蔽,春花似錦荡碾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至铐尚,卻和暖如春拨脉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宣增。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工玫膀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爹脾。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓帖旨,卻偏偏與公主長(zhǎng)得像箕昭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子解阅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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