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堤瘤、RESTEasy、CXF浆熔。這幾個(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