关于Restful Web Service的一些理解
對于restful web service,剛開始確實是個不太好理解的概念。
看了些文章,總是在描述和解釋restful的原則:
1)顯式地使用HTTP方法。
2)無狀態。
3)公開目錄結構式的 URI。
4)傳輸 XML、JavaScript Object Notation (JSON),或同時傳輸這兩者。
可是為什么要這樣, 除了這種web service還有沒有其他類型的web service?等問題仍難比較糊涂。
直到看了這篇文章:http://www.ibm.com/developerworks/cn/webservices/0907_rest_soap/
感覺有點明白了,又去看了一下Restful Web Service這本書,才恍然大悟,原來如此。
1. 什么是Restful
其實早在web service概念產生前就有了restful的概念,或者說restful是和Http一起誕生的。
可以參閱 Roy Fielding 的論文“Architectural Styles and the Design of Network-based Software Architectures”, 我本身并沒有讀過。
Restful的意思是‘寧靜的’,你可以理解為‘簡約而不簡單’,或者‘和諧的’。一個協議只有足夠的簡約才有擴展性和生命力,復雜的東西往往伴隨的是大量bug和規模膨脹后的不可控。
Restful就是Http的本質,僅僅是一個資源URI,和Get,Post,Put,Delete四種操作。一切Web的行為皆源于此。
所以早期的網站,或者說是靜態的網站的都是Restful的,如果廣義的把瀏覽器獲取web page當做一種web service的話,那么他們都提供了Restful Web Service。
所以Restful并不是個陌生的概念,更不是個新的概念,只不過是一直被忽略了。
一樣東西之所以被忽略,因為沒有對立面, 或者說沒有可比較的東西。世界上的概念都是相對的,有了丑才有美,有了胖才有瘦。
同樣當僅僅只有restful的時候,便很少有人真正了解restful的意思。
直到有一天,restful的原則被打破,世界上出現了非restful的web行為,我們可以把它稱做‘RPC-style’的web service。
2. RPC-style
RPC是個大家都很熟悉的東西,remote procedure call,就是說我要調用其他機器上的程序就象調用我本機的函數一樣。
早期的做法開個socket端口,把參數傳過去,然后執行完再通過socket把結果傳回來。
這樣的缺點是就是不同的解決方案的傳參數和結果的協議不同,大家之間沒發通用,還有就是可能無法穿越防火墻。
直到XML技術誕生,用XML來規范接口,并且XML文檔本身就是純文本可以方便的通過Http端口傳輸,這樣就大大的方便了在web互相之間的調用。
于是Web Service的概念誕生了,而這種Web Service是‘RPC-style’的。
3. Http
順便聊一下Http協議,Http誕生就是為了進行Web訪問,用來傳輸Html文檔的。不過他的能力遠遠大于此。
Http本身就是個envelope協議,他并不管envelop里面裝的是什么,所以其實你可以通過http傳輸任意數據(圖片,音樂),只要可以將它編碼成文本(如用base64)。
Http本身規定了4種操作,可是他并沒有強制服務器真正的行為。比如你通過Http發出的Get指令,服務器在收到這個指令后可以做些完全和Get不相關的事情。
Http的靈活性帶來了很多好處,但同時也帶來了副作用,Web不再restful,變的有點小亂。
4. ROA
其實RPC-style和Restful看待事物的角度是不同的,大家都說Restful是一種RO,即面向資源的,那么RPC-style應該仍難是傳統的OO,即面向對象的。
對于RPC-style而言,Server就是一個對象,這個對象有許多的屬性和方法,我們通過http傳遞參數來調用這些方法,這里http僅僅被用來做為一個傳遞者,request的真正含義皆在soap envelop中。
對于Restful而言,Server就是個資源的集合,里面有web pages,web services,或其他資源,對于資源的操作是固定的。我們可以用http象訪問網頁一樣訪問web service。
對于Web而言,似乎ROA這種架構更能保持web訪問的一致性,也更簡單。
5. Ajax
Ajax出現的初始動機就是我們可以僅僅刷新部分網頁,這樣更快,也更合理,不然每次都要刷新整個網頁。
同時,Ajax的出現也為遵守Restful原則提供了一種很好的solution。
Restful很重要的原則是無狀態性,即服務器不會保存http request的上下文。這是很必要的,否則當用戶很多時,服務器的負荷會爆掉的。
我們應該在客戶端記錄request上下文,然后每次發給服務器。
Ajax出現前,每次request都會刷新這個頁面,所以很難記錄之前request的上下文,現在有了Ajax, 用戶不用每次刷新整個頁面,所以可以有效的記錄上下文。
所以可以比較簡單的完成胖客戶端-瘦服務器的架構。
詳細可參見http://www.ibm.com/developerworks/cn/web/wa-ajaxarch/
總結
以上是生活随笔為你收集整理的关于Restful Web Service的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到老公没工作了怎么办
- 下一篇: 梦到失火又被自己浇灭了啥意思