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

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

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

    zyskm用夢想丈量人生,用奔跑丈量激情

    Restful架構

     今天抽空整理些有關rest方面的理論。主要參考了幾篇網上的文章,做了些整理,原文見附錄。

    一、起源

    越來越多的人開始意識到,網站即軟件,而且是一種新型的軟件。
    這種"互聯網軟件"采用客戶端/服務器模式,建立在分布式體系上,通過互聯網通信,具有高延時(high latency)、高并發等特點。
    網站開發,完全可以采用軟件開發的模式。但是傳統上,軟件和網絡是兩個不同的領域,很少有交集;軟件開發主要針對單機環境,網絡則主要研究系統之間的通信。互聯網的興起,使得這兩個領域開始融合,現在我們必須考慮,如何開發在互聯網環境中使用的軟件。
    RESTful架構,就是一種互聯網軟件架構。它結構清晰、符合標準、易于理解、擴展方便,所以正得到越來越多網站的采用。
     

    二、名稱

    Fielding將他對互聯網軟件的架構原則,定名為REST,即Representational State Transfer的縮寫。我對這個詞組的翻譯是"表現層狀態轉化"。

    如果一個架構符合REST原則,就稱它為RESTful架構。

    要理解RESTful架構,最好的方法就是去理解Representational State Transfer這個詞組到底是什么意思,它的每一個詞代表了什么涵義。如果你把這個名稱搞懂了,也就不難體會REST是一種什么樣的設計。

    三、資源(Resources)

    REST的名稱"表現層狀態轉化"中,省略了主語。"表現層"其實指的是"資源"(Resources)的"表現層"。

    所謂"資源",就是網絡上的一個實體,或者說是網絡上的一個具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的實在。你可以用一個URI(統一資源定位符)指向它,每種資源對應一個特定的URI。要獲取這個資源,訪問它的URI就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。

    所謂"上網",就是與互聯網上一系列的"資源"互動,調用它的URI。

    四、表現層(Representation)

    "資源"是一種信息實體,它可以有多種外在表現形式。我們把"資源"具體呈現出來的形式,叫做它的"表現層"(Representation)。

    比如,文本可以用txt格式表現,也可以用HTML格式、XML格式、JSON格式表現,甚至可以采用二進制格式;圖片可以用JPG格式表現,也可以用PNG格式表現。

    URI只代表資源的實體,不代表它的形式。嚴格地說,有些網址最后的".html"后綴名是不必要的,因為這個后綴名表示格式,屬于"表現層"范疇,而URI應該只代表"資源"的位置。它的具體表現形式,應該在HTTP請求的頭信息中用Accept和Content-Type字段指定,這兩個字段才是對"表現層"的描述。

    五、狀態轉化(State Transfer)

    訪問一個網站,就代表了客戶端和服務器的一個互動過程。在這個過程中,勢必涉及到數據和狀態的變化。

    互聯網通信協議HTTP協議,是一個無狀態協議。這意味著,所有的狀態都保存在服務器端。因此,如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發生"狀態轉化"(State Transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。

    客戶端用到的手段,只能是HTTP協議。具體來說,就是HTTP協議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET用來獲取資源,POST用來新建資源(也可以用于更新資源),PUT用來更新資源,DELETE用來刪除資源。

    六、綜述

    綜合上面的解釋,我們總結一下什么是RESTful架構:

      (1)每一個URI代表一種資源;

      (2)客戶端和服務器之間,傳遞這種資源的某種表現層;

      (3)客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現"表現層狀態轉化"。

     

    REST關鍵原則

    一個簡單扼要的定義:REST定義了應該如何正確地使用Web標準,例如HTTP和URI。如果你在設計應用程序時能堅持REST原則,那就預示著你將會得到一個使用了優質Web架構(這將讓你受益)的系統。總之,五條關鍵原則列舉如下:

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

     

    為所有“事物”定義ID

    在這里我使用了“事物”來代替更正式準確的術語“資源”,因為一條如此簡單的原則,不應該被淹沒在術語當中。思考一下人們構建的系統,通常會找到一系列值得被標識的關鍵抽象。每個事物都應該是可標識的,都應該擁有一個明顯的ID——在Web中,代表ID的統一概念是:URI。URI構成了一個全局命名空間,使用URI標識你的關鍵資源意味著它們獲得了一個唯一、全局的ID。


    值得被URI標識的事物——資源——要比數據庫記錄抽象的多。標識所有值得標識的事物,領會這個觀念可以進一步引導你創造出在傳統的應用程序設計中不常見的資源:一個流程或者流程步驟、一次銷售、一次談判、一份報價請求——這都是應該被標識的事物的示例。

    將所有事物鏈接在一起

    接下來要討論的原則有一個有點令人害怕的正式描述:“超媒體被當作應用狀態引擎(Hypermedia as the engine of application state)”,有時簡寫為HATEOAS。(嚴格地說,這不是我說的。)這個描述的核心是超媒體概念,換句話說:是鏈接的思想。鏈接是我們在HTML中常見的概念,但是它的用處絕不局限于此(用于人們網絡瀏覽)。


    使用標準方法

    在前兩個原則的討論中暗含著一個假設:接收URI的應用程序可以通過URI明確地一些有意義的事情。如果你在公共汽車上看到一個URI,你可以將它輸入瀏覽器的地址欄中并回車——但是你的瀏覽器如何知道需要對這個URI做些什么呢?

    它知道如何去處理URI的原因在于所有的資源都支持同樣的接口,一套同樣的方法(只要你樂意,也可以稱為操作)集合。在HTTP中這被叫做動詞(verb),除了兩個大家熟知的(GET和POST)之外,標準方法集合中還包含PUT、DELETE、HEAD和OPTIONS。這些方法的含義連同行為許諾都一起定義在HTTP規范之中。


    資源多重表述

    在實踐中,資源多重表述還有著其它重要的好處:如果你為你的資源提供HTML和XML兩種表述方式,那這些資源不僅可以被你的應用所用,還可以被任意標準Web瀏覽器所用——也就是說,你的應用信息可以被所有會使用Web的人獲取到。

    無狀態通信

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

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

     

    REST風格的一個“化身”便是HTTP(以及一套相關的一套標準,比如URI)。

    附錄:
    1.深入淺出REST http://www.infoq.com/cn/articles/rest-introduction
    2.理解Restful 架構 http://www.ruanyifeng.com/blog/2011/09/restful.html
    3.Rest和soap比較 http://www.infoq.com/cn/articles/rest-soap-when-to-use-each
    4.Rest和Rpc比較 http://xinklabi.iteye.com/blog/807220

     

    posted on 2012-06-19 15:44 zyskm 閱讀(3121) 評論(3)  編輯  收藏

    評論

    # re: Restful架構 2012-06-19 17:57 foo

    好文,感謝博主的分享  回復  更多評論   

    # re: Restful架構[未登錄] 2012-06-19 21:28 paulwong

    Restful不支持事務。  回復  更多評論   

    # re: Restful架構 2012-06-20 10:31 zyskm

    rest是無狀態的所以不存在事務的概念,對于多個系統的分布式事務問題網上倒是有些討論,沒看到特別準確的定義。  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费国产黄线在线观看| 国产免费久久精品丫丫| 黄色网址免费观看| 亚洲精品免费在线| 精品国产污污免费网站aⅴ| 亚洲国产综合专区在线电影| a级毛片毛片免费观看久潮| 亚洲AV综合色区无码一区爱AV | 91av视频免费在线观看| 久久久久亚洲精品成人网小说| 黄网站色视频免费在线观看的a站最新| 亚洲精品自在在线观看| 日本免费中文字幕| 亚洲精品亚洲人成在线观看麻豆 | a级午夜毛片免费一区二区| 亚洲AV无码一区二区三区DV| 青青草原1769久久免费播放| 亚洲精品亚洲人成在线观看麻豆| 啦啦啦中文在线观看电视剧免费版 | 四虎永久免费影院| 一区二区三区精品高清视频免费在线播放 | 亚洲日韩精品无码AV海量| 国产v片免费播放| 中文字幕av无码不卡免费 | 亚洲欧美日韩自偷自拍| 免费在线视频一区| 免费看搞黄视频网站| 亚洲av无码不卡久久| 国产麻豆免费观看91| 国产久爱免费精品视频| 亚洲综合久久综合激情久久| 日韩免费视频在线观看| 国产精品免费观看视频| 久久亚洲精品国产精品| 国产精品视频免费一区二区三区 | 久久乐国产综合亚洲精品| 国产精品V亚洲精品V日韩精品| 99久久精品免费视频| 亚洲AV无码国产精品永久一区| 亚洲高清国产AV拍精品青青草原| 国国内清清草原免费视频99|