posts - 262,  comments - 221,  trackbacks - 0

          InfoQ上有一篇《深入淺出REST》的文章:http://www.infoq.com/cn/articles/rest-introduction

          文章中的主要觀點包括了:

           A. 為所有“事物”定義ID
           B. 將所有事物鏈接在一起
           C. 使用標準方法
           D. 資源多重表述
           E. 無狀態通信

          讀完后有下列疑問:

          A. 觀點1中這個“ID”如何定義?

          文章中提到了使用URI作為所有“事物(資源)” 的唯一ID,于是為了這樣一個疑問:為什么不能用URL,而用URI呢?網上對URI和URL的區別并沒有一個明確的說服,我個人的理解是這樣的:

          URI是資源標識符,而URL是資源定位器。假設我們對所有的資源都進行統一標識(注意是全局唯一標識),有一個資源的標記是4321,那么這個4321是URI。而如何獲取到這個4321資源呢?URI并沒有說明。于是我們可以同HTTP協議,或者FTP協議來獲取,這種依賴于特定通訊協議的獲取方式就是URL了。

          但是不管是URI還是URL,只要指向同一個資源,最終都是通過唯一的這個標識(URI)來區分資源的。

          不知道這個理解是否正確?

          B. 要為那些“事物”定義ID?

          文章中提到了我們不單為一個單一的資源定義ID,我們也可以為資源的集合定義ID。于是就有了這樣的疑問:

          對于一些集合范圍比較明確的資源,比如blog的按年月日分類,我們可以簡單地使用諸如這樣的URL:http://xxx.com/archive/2010/06/24/324348.html 來表示REST風格的資源,但是如果這個集合的范圍是模糊的,或者是靠某些條件表達式的執行結果來限制的,比如說所有符合條件1的文章集合。那么對于這種模式的資源,REST又如何來表示呢?

          進一步地引申到實現問題?假如為這么多事物引入ID,那么會不會導致我們的存儲結構暴增?在上面這篇文章中也提到了這樣的觀點:

          例如,一個定單資源可以由定單項、地址以及許多其它方面(可能不希望作為單獨標識的資源暴露出來)組成。標識所有值得標識的事物,領會這個觀念可以進一步引導你創造出在傳統的應用程序設計中不常見的資源:一個流程或者流程步驟、一次銷售、一次談判、一份報價請求——這都是應該被標識的事物的示例。同樣,這也會導致創建比非RESTful設計更多的持久化實體。


          C. 使用鏈接指向任何可以標識的事物

          這一點上,我看不出REST和傳統的的Web概念有什么明顯區別的地方?也許是我的理解不夠

          D. “標準方法”是否夠用?

          從文章中可以看出,REST依靠HTTP協議的動詞(get/put/delete)來描述對資源的操作,于是在我們的應用端有了很多抽象的標準方法:getAll, delete, getById....。問題是僅僅依靠這些標準方法夠嗎?

          傳統的WEB請求是通過在請求中附著參數信息,如XXX.jsp?參數1&參數2,如果我們采用了REST方式的URI描述,對于一些復雜的請求描述,會不會導致描述困難?而且對應的服務器端方法如何定義?畢竟現在很多的交互網站都有大量的自定義查詢,僅靠幾個簡單的CRUD方法定義顯然不能滿足,那么REST是如何解決的呢?

          E. 無狀態通信如何實現

          這是最令我困惑的一個地方。原文翻譯如下:

          無狀態通信是我要講到的最后一個原則。首先,需要著重強調的是,雖然REST包含無狀態性(statelessness)的觀念,但這并不是說暴露功能的應用不能有狀態——
          事實上,在大部分情況下這會導致整個做法沒有任何用處。REST要求狀態要么被放入資源狀態中,要么保存在客戶端上。或者換句話說,服務器端不能保持除了單次請求之外的,任何與其通信的客戶端的通信狀態。這樣做的最直接的理由就是可伸縮性—— 如果服務器需要保持客戶端狀態,那么大量的客戶端交互會嚴重影響服務器的內存可用空間(footprint)。(注意,要做到無狀態通信往往需要需要一些重新設計——不能簡單地將一些session狀態綁縛在URI上,然后就宣稱這個應用是RESTful。)

          但除此以外,其它方面可能顯得更為重要:無狀態約束使服務器的變化對客戶端是不可見的,因為在兩次連續的請求中,客戶端并不依賴于同一臺服務器。一個客戶端從某臺服務器上收到一份包含鏈接的文檔,當它要做一些處理時,這臺服務器宕掉了,可能是硬盤壞掉而被拿去修理,可能是軟件需要升級重啟——如果這個客戶端訪問了從這臺服務器接收的鏈接,它不會察覺到后臺的服務器已經改變了。

          對于這個觀點我是十分贊成的,應用可以有狀態但這個狀態的改變,不要依賴于特定的協議狀態(比如Session本身就是為了解決HTTP無狀態而存在的)。

          這里我感興趣的是實現方式?既然不提倡用協議的狀態,又不能在URL附著,那么如何在URI中體現出來呢?如果在URI中暴露出來,會不會令到用戶的信息泄露?如果是保存到客戶端,除了寫cookie和文件好像我沒有像到太多別的方法?但是這兩種方式經常由于安全原因被用戶禁掉

          歡迎大家指教!!

          最新更新:在JE上看到一篇REST的帖子討論,非常精彩。雖然是07年的,但是依然有很好的指導意義。解開了不少困惑

          http://www.javaeye.com/topic/70113


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2010-09-07 11:04 Paul Lin 閱讀(1793) 評論(1)  編輯  收藏 所屬分類: 其它技術


          FeedBack:
          # re: 對REST理解上的一些疑問[未登錄]
          2010-09-15 17:45 | Sam
          翻翻以前的哦feed看到你的問題,試著回答下吧。
          A. 觀點1中這個“ID”如何定義?
          我粗略看了下原文,文中并沒有提及一定要用URI,不能用URL這種觀點。URL和URI的介紹很多,怎么可能沒有一個明確的說服呢?
          而且,無論用URL或者URI來說明ID如何定義這章節都不沖突。就跟說北京有故宮博物館和中國有故宮博物館一樣的道理。

          B. 要為那些“事物”定義ID?
          你的問題是“那么對于這種模式的資源,REST又如何來表示呢?”
          我試著回答,假設你有個查詢需要查詢所有姓為“張”,并且出生日期在1950年前的。那么定義URL的時候,這種集合性的資源ID是后臺解析這個查詢邏輯的地方定義的。舉個例子,老板給你一個feature讓你做,這個feature要做很多邏輯。那么老板給你講的時候,不會把這個case的邏輯說一遍,只會告訴你case名稱,這個case名稱就是ID。不要想著把整個case的實現邏輯在URI中體現,僅僅定義個ID即可。

          C. 使用鏈接指向任何可以標識的事物
          不清楚具體哪個地方不理解,其實這個不用較真。如果你以前寫web的時候就已經follow了些類似的REST風格,那么相比就是沒太大的區別。
          而且就REST的風格來講,國外的一些大牛們也吵來吵去的。所謂的風格,不局限于一定要按照某種方式去寫才叫REST。理解概念,將其應用到web開發中去,外面的人看懂沒看懂不一定強制要求,Team內能達成一致并相互理解就算成功。

          D. “標準方法”是否夠用?
          既然叫做標準方法,就是就是解決web開發中一些標準問題,例如CRUD。
          當然這個不是絕對的,我曾經看到過一些REST實踐的人不用DELETE,GET來做,僅僅用POST就可以實現REST開發,可向其概念與應用存在著并非絕對的關系。
          你說的是否夠用我想能你從業務角度考慮問題,不是先選技術,再去解決特定業務問題。而是從業務角度尋找最佳技術解決方案。
          如果業務系統很大,REST無法完美的解決相應case問題,或者說能夠解決但會很復雜。那么你可以考慮基于WSDL的WebService來實現,很多文章都在說兩個的區別和應用場景,你可以參考一下。

          E. 無狀態通信如何實現
          這個我這樣理解,跳出基于HTML4標準的Web開發方式。想想如下場景:
          1. 基于CS模型的客戶端開發方式,例如用WPF,SWT,WinForm等。
          2. 基于RIA Web框架的開發訪方式,例如Silverlight, Flash, JFX等。
          3. 基于HTML5的開發模式。
          4. 基于腳本語言的開發模式,例如用Ruby或者Grovy訪問web等。

          以上拙見,就叨叨這些吧。  回復  更多評論
            
          <2010年9月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 孙吴县| 晋中市| 富裕县| 阳原县| 东明县| 略阳县| 嘉禾县| 毕节市| 曲周县| 庆云县| 阜平县| 根河市| 桓台县| 两当县| 平泉县| 武清区| 新疆| 马关县| 开阳县| 喀什市| 贡嘎县| 玛多县| 乐至县| 澄迈县| 雷州市| 巢湖市| 双鸭山市| 吐鲁番市| 确山县| 涿鹿县| 四会市| 新平| 平潭县| 南投县| 远安县| 察雅县| 马公市| 平果县| 扎兰屯市| 乌拉特中旗| 塔城市|