posts - 262,  comments - 221,  trackbacks - 0

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

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

           A. 為所有“事物”定義ID
           B. 將所有事物鏈接在一起
           C. 使用標(biāo)準(zhǔn)方法
           D. 資源多重表述
           E. 無狀態(tài)通信

          讀完后有下列疑問:

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

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

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

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

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

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

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

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

          進(jìn)一步地引申到實現(xiàn)問題?假如為這么多事物引入ID,那么會不會導(dǎo)致我們的存儲結(jié)構(gòu)暴增?在上面這篇文章中也提到了這樣的觀點:

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


          C. 使用鏈接指向任何可以標(biāo)識的事物

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

          D. “標(biāo)準(zhǔn)方法”是否夠用?

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

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

          E. 無狀態(tài)通信如何實現(xiàn)

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

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

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

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

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

          歡迎大家指教!!

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

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


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


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

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

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

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

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

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

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 耒阳市| 石嘴山市| 平果县| 西贡区| 霍林郭勒市| 遵义市| 手游| 包头市| 孟津县| 正定县| 宿州市| 锦屏县| 恭城| 昌黎县| 长阳| 华阴市| 营山县| 滨州市| 武宁县| 大港区| 永宁县| 石阡县| 隆安县| 孙吴县| 九龙城区| 芦山县| 开原市| 永德县| 锡林郭勒盟| 绥德县| 宣城市| 丁青县| 南靖县| 鹤庆县| 额敏县| 陇西县| 邢台市| 河间市| 藁城市| 塘沽区| 金塔县|