Restful API的設計與實踐

jopen 8年前發布 | 16K 次閱讀 WEB服務/RPC/SOA

Restful這個名稱應該很多人都不陌生,但是我發現不少人對Restful存在或多或少的理解偏差,其中不泛比較厲害的程序員,所以有必要為Restful來“正名”。

Restful是一種軟件架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用于客戶端和服務器交互類的軟件。基于這個風格設計的軟件可以更簡潔,更有層次,更易于實現緩存等機制。(詳見百度百科介紹

Restful的關鍵是抽取資源,使用URL與資源進行對應。這邊也是多數人理解有偏差之處,即Restful應該理解為面向資源的架構風格,URL的設計應該是從資源的角度出發,而不應有任何的“動作”設計,其中單個資源共享同一個接口,而不同的“動作”通過請求的方法進行區分。這也是和RPC調用方式或RPC-Restful混合調用方式最大的不同之處。

那么為什么要使用Restful風格?有什么優勢?


1、 統一接口:約定大于配置,有了統一的規范,大家在接口設計時能夠保證理解的一致性,這樣首先便于接口的理解。另外同一資源URL一致,不同的CURD操作通過不同的Http協議方法進行區分,這樣在設計上做到了簡化。統一接口還有個非常容易被忽視的好處,就是方便使用Http協議自帶的緩存機制對請求進行緩存操作,這樣在一定程度上又提高了請求的性能。

2、無狀態性:由于使用Http協議進行調用,每個請求都包含了服務器所需的全部信息,所以這種方式非常適用于異構系統之間的調用,同時也良好地支持分布式架構,可以動態地擴展服務器。這也是一個非常明顯的優勢。

Restful風格非常好,具體如何設計?


1、 提取資源: 這一步非常關鍵,也是Restful的核心思想所在。在面向對象的世界里,對于資源的識別不算太難,一般情況下資源即是想要處理的對象,如果對應到表結構上面,可能就是表對應的實體。例如電子商務網站上的下訂單,那資源就是訂單;如果是商品展示,那資源就是商品。當然這是最簡單的情況,如果稍微復雜一點,比如現在是家電類的商品展示怎么辦呢?那資源就是商品-家電類。像上面所述的情況,資源比較好識別,而有些情況下資源就不是那么明顯了,比如登錄,這是哪門子資源?這種情況確實不太好抽象,不過可以理解為登錄信息資源。登錄操作是對登錄信息資源的新增操作。還有其它更復雜的情況,這個就得發揮面向資源的思路做進一步的抽象了。

2、URI設計: URI的設計其實與資源提取緊密相關,基本只要資源提取出來了,URI只是相應地翻譯成地址就可以,有層級的資源通過分隔符進行路徑區分。例如上面提到的商品展示可以是/goods,家電類商品可以/goods/elecequipt/,而登錄可以是/loginInfo。

3、具體的動作: 這個嚴格說來并不是設計的一部分,是屬于規范的一部分。因為使用Http協議,而協議中正好有相應的方法支持,所以正好使用Http協議的方法。(1)GET:獲取資源的方法;(2)PUT:更新資源的方法;(3)POST:創建資源的方法;(4)DELETE:刪除資源的方法。這幾個 是比較常用的,還有幾個不太常用的方法:(5)OPTIONS:查看資源支持哪些方法;(6)HEAD:與PUT類似,只不過HEAD只返回報頭,不返回表示。
這里需要著重提一下,很多Restful-RPC混合模式可能就只會使用POST方法,這里就是混合模式與Restful風格最明顯的區別之一。

4、返回結果: 返回結果包括Http請求的狀態碼和資源的表述。很多情況下API的返回結果使用Json或者XML格式表示,而Json是更加常用的。因為Json相比XML更加輕量,這樣在傳輸過程中資源更小傳輸更快,另外Json的解析支持更廣,所以解析起來非常方便。

5、緩存: Http協議是天然支持緩存的,這個也有利于性能的提升。當然服務端也可以添加緩存提高性能,這是另一個話題。緩存具體的實現在Http Header里面進行設置,例如Cache-Control、Expires。具體用法可以參見協議頭描述:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

6、安全性: 如果資源是公開的,那也沒有什么安全性可言了。但是實際情況是很多資源是有對應的“權限”進行操作的,這個時候就需要進行身份的認證,認證才能夠進行相應的操作。所以安全性也是設計中很重要的一環。
那么安全性如何保證呢?在Http協議中有Authorization頭可以進行相關設置,最基本的可以使用Basic方式,更加安全的加密方式使用Digest方式,更進一步提高安全性還可以使用第三方的OAuth協議進行認證,OAuth也是經常采用的方式。具體使用可參考網上看到的一篇非常好的博文:理解OAuth2.0。另外為了安全性的保證,大多數情況下還會選用https協議進行傳輸。

設計的思路有了,那么該如何付諸實踐?


1、 使用場景: 前面也提到了,Restful風格特別適合于異構系統之間的調用,另外在分布式場景中也比較適用。比如現在移動端APP的接口設計很多都采用這種風格,另外有不少云平臺提供的服務接口也大多采用Restful風格設計。使用還是比較廣泛的。

2、實踐示例: 說了半天理論還是略顯空洞,下面直接來點示例加深下理解。限于篇幅,這里推薦幾個看到的比較好的例子。
簡單情況下的使用示例可以參考網上看到的一篇非常好的博文:理解Restful架構
稍微復雜一點的情況可以考慮現在比較知名的云平臺的API設計,比如百度云推送API設計:http://push.baidu.com/doc/restapi/restapi。另外還推薦一個看到的Saas服務商的Restful設計文檔,寫得很好,環信的聊天API設計:http://docs.easemob.com/doku.php?id=start:100serverintegration
這邊有幾個有意思的地方可以特別關注下,比如API中的安全認證設計、接口輸入輸出設計。另外如果看得仔細,可能會注意到百度云平臺推送平臺的API設計可能與前面提到的Restful本身的設計思路有些出入,百度云推送的設計方式嚴格說來應該算是Restful-Rpc混合模式的設計。不過也不影響做為參考。

3、框架支持: 這里以Java版本的為例。Java對于Restful有一個規范定義JAX-RS,而支持Restful框架也不少,比如:RestletJerseyRESTEasyCXF。這幾個框架的比較可以參考這篇博文:http://www.infoq.com/cn/news/2008/10/jaxrs-comparison/。我對Restlet和Jersey進行了簡單了解,沒有做深入的使用,覺得Restlet的文檔是做得更好的。
除了上面提到的框架,現在非常流行的Spring MVC框架也對Restful有良好的支持,比如可以參考這篇的實踐:http://www.importnew.com/7903.html,Spring框架的支持還是非常不錯的。

參考資料


1、《RESTful Java with JAX-RS 2.0》
2、《RESTful Web APIs》
3、《RESTful Web Services Cookbook》中文版
4、《RESTful Web Services》中文版
5、《REST實戰》中文版


同步發表于CSDN博客: http://blog.csdn.net/qiubabin/article/details/50214811

來自: http://www.jianshu.com/p/c117d32aded4

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!