<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1797) 評論(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熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 午夜爱爱免费视频| 午夜精品射精入后重之免费观看 | 成人黄页网站免费观看大全| 亚洲精品美女在线观看播放| 99re这里有免费视频精品| 亚洲色图校园春色| 国产精品免费观看| 亚洲综合欧美色五月俺也去| 成人毛片18女人毛片免费视频未| 亚洲男同gay片| 亚洲精品无码久久毛片| 成在线人免费无码高潮喷水| 亚洲VA成无码人在线观看天堂| 小草在线看片免费人成视久网| 亚洲毛片基地日韩毛片基地| 99久久这里只精品国产免费| 亚洲精品国产第一综合99久久| 国产在线19禁免费观看国产 | 国产成人久久AV免费| 久久精品国产亚洲香蕉| 精品久久8x国产免费观看| 日本亚洲免费无线码| 免费大香伊蕉在人线国产| 亚洲第一视频在线观看免费| 久久久久亚洲av无码尤物| 日韩免费一区二区三区在线 | 亚洲国产精品成人AV在线 | 黄色短视频免费看| 久热综合在线亚洲精品| 一二三四免费观看在线视频中文版 | 亚洲喷奶水中文字幕电影| 国产福利在线免费| 一级毛片免费播放男男| 亚洲国产日韩一区高清在线| 成人免费视频网址| 中文毛片无遮挡高清免费| 亚洲欧洲日韩不卡| 国产片免费福利片永久| 国内永久免费crm系统z在线| 亚洲色大情网站www| 亚洲永久精品ww47|