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

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

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

    神奇好望角 The Magical Cape of Good Hope

    庸人不必自擾,智者何需千慮?
    posts - 26, comments - 50, trackbacks - 0, articles - 11
      BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    JAX-RS 從傻逼到牛叉 1:REST 基礎知識

    Posted on 2011-09-16 15:31 蜀山兆孨龘 閱讀(5470) 評論(3)  編輯  收藏 所屬分類: Java EE 、SOA

    JAX-RS(JSR 311 - Java™ API for RESTful Web Services,用于 REST 風格的 Web 服務的 Java™ API)是 Java EE 6 規范的一部分,其目標在于簡化和標準化用 Java 開發 REST 風格的 Web 服務。雖然 Java EE 6 剛出爐的時候,樓主也從頭到尾看過這份規范,但苦于沒有實際的項目練手,看過又忘了,現在最多算達到大成傻逼的境界。這次邊看邊寫,期望完成后至少能破入小成牛逼。先從 REST 本身開始。


    REST(REpresentational State Transfer,代表性狀態傳輸)自稱是一種風格而非標準,這在樓主看來有炒作的嫌疑。如果僅僅是一種風格,那么不同的框架如何兼容?所以才有 JAX-RS 的誕生。REST 最大的貢獻是帶來了 HTTP 協議的復興。為什么叫復興呢?本來 HTTP 的功能挺豐富的,可惜長期以來只被用作傳輸數據,大好青年被埋沒了。樓主記得剛開始學 Servlet 的時候,一向是把 doGetdoPost 兩個方法一視同仁的,因為書上這么教,很多 Web 框架也這么搞,以至于弄了很久才搞清楚 GETPOST 是兩種不同的請求。現在 REST 拍磚說道,HTTP 早就定義好了一堆操作,以前一直被混淆使用,現在應該重新賦予它們本來的意義了,而且如果充分發揮 HTTP 的功能,完全能夠勝任分布式應用的開發(傳說中的 SOA)。


    SOA 的理念在于將系統設計為一系列可重用的、解耦的、分布式的服務。這也不是新鮮玩意兒了,早期有 CORBA,稍晚有 SOAP 等等。REST 作為后起之秀,能夠快速崛起,也必有其非同尋常的特色。下面一一列舉。

    可尋址性(Addressability)

    系統中的每個資源都可以通過唯一標識符來訪問。小插一句,“標識”的正確讀音是 biāozhì。REST 使用 URI(統一資源標識符)管理資源的地址。URI 的概念不解釋。一個 URI 可以指向一個或者多個資源。

    統一的受限接口(The Uniform, Constrained Interface)

    實際上強調了 HTTP 操作的原意。REST 主要使用了 GET、PUT、DELETE、POST、HEAD 和 OPTIONS 這 6 種操作。此處有兩個曾經被忽略的 HTTP 概念:冪等(idempotent)和安全(safe)。冪等應該是 HTTP 從數學借來的一個術語(原始的數學意義樓主也不懂),意味著若干次請求的副作用與單次請求相同,或者根本沒有副作用。GET、PUT、DELETE、HEAD 和 OPTIONS 都是冪等的:GET、HEAD 和 OPTIONS 都是讀操作,容易理解;PUT 用于創建或更新已知 URI 的資源,多次創建或更新同一個資源顯然和一次的效果相同;DELETE 刪除資源,亦然。安全表示操作不會影響服務器的狀態。GET、HEAD 和 OPTIONS 是安全的。POST 既不冪等又不安全,因為和 PUT 不同,POST 創建資源的時候并不知道資源的 URI,所以多個 POST 請求將會創建多個資源。

    面向表象(Representation-Oriented)

    表象這個詞有點拗口,傳聞在一個 REST 風格的系統中,服務端和客戶端之間傳輸的咚咚就是表象……表象可以是純文本、XML、JSON……或者自編的山寨格式。唉,不就是數據么?只不過可以用任意的格式來傳輸,因為 HTTP 正文里面啥都能放。Content-Type 頭用來聲明格式,一般是 MIME(多用途因特網郵件擴展),像 text/plain、text/html、application/pdf 這些。MIME 可以帶屬性,例如 text/html; charset=UTF-8

    無態通信(Communicate Statelessly)

    REST 服務器只管理資源,而不會像 Web 服務器一樣記錄客戶的會話狀態,這些應該由客戶端來管理,如此就能增強 REST 服務器的伸縮性。此處的客戶端可以是客戶端程序、瀏覽器,甚至一個 Web 應用。總之,REST 只負責庫管啦!

    HATEOAS

    猛詞砸來了!HATEOAS = Hypermedia As The Engine Of Application State,超媒體作為應用狀態的引擎,怎么看起來比 SaaS(Software as a Service,軟件作為服務)還要嚇人呢?超文本不過是一只紙老虎,超媒體也瞞不過樓主的天眼:超媒體就是是由文字、圖像、圖形、視頻、音頻……鏈成一體的大雜燴!很簡單的一個例子,有些坑爹的電影網站經常發布一些內嵌了廣告的電影,播放的時候會彈出廣告窗口,里面很多鏈接,你去點兩下就中招了:這個電影文件就算是超媒體。

    其實這個詞最關鍵的地方是“狀態引擎”。例如樓主在去網購,先選了幾個東西,接下來可以干啥呢?可以繼續選、可以把購物車清空、可以結賬……樓主可以從現狀“轉換”到其他某些狀態,而控制狀態轉換的那個咚咚就被冠名為狀態引擎。多么聰明的詞匯??!樓主發現凡是高手都是造詞磚家呀!用超媒體來控制狀態轉換,就是 HATEOAS:你是要繼續看電影還是看廣告?看哪個廣告?自己慢慢考慮……


    REST 相比 CORBA、SOAP、WS-* 之流確實獨樹一幟,但也難逃玩弄概念的嫌疑。記得大學里講數據庫的老師說過:“你們現在學了這么多理論,其實以后在工作中未必管用。在大街上隨便找一個軟件培訓學校出來的小伙子,他哪兒懂什么第二第三范式啊?但卻能把數據庫玩兒得飛轉!”


    評論

    # re: JAX-RS 從傻逼到牛逼 1:REST 基礎知識  回復  更多評論   

    2011-09-29 23:41 by 李衛
    POST 既不冪等又不安全,因為和 PUT 不同,POST 創建資源的時候并不知道資源的 URI,所以多個 POST 請求將會創建多個資源。
    請問這句話是什么意思?為什么post請求可以創建多個資源,put就不會呢?

    # re: JAX-RS 從傻逼到牛逼 1:REST 基礎知識  回復  更多評論   

    2011-09-30 17:41 by 蜀山兆孨龘
    @李衛
    這些其實都是 HTTP 約定的,如果你喜歡的話,完全可以讓 POST 冪等而 PUT 不冪等。如果程序嚴格遵守 HTTP,在用 POST 請求創建資源的時候,是不知道所創建的資源的 URI,這個就用像 EntityManager#persist 持久化一個沒有設定主鍵的實體一樣,系統將自動生成主鍵,多次調用生成的主鍵不同,自然就創建了多個資源,所以不是冪等的。PUT 就像 EntityManager#merge,用于更新一個系統中已經存在的資源,所以主鍵是確定的,從而 URI 也確定了。用 PUT 請求多次更新同一個資源,效果和只更新一次相同,所以是冪等的。

    # re: JAX-RS 從傻逼到牛叉 1:REST 基礎知識  回復  更多評論   

    2011-12-05 17:32 by 天空布藍
    沒有看懂。。。。
    主站蜘蛛池模板: 亚洲国产精品久久66| 日本免费一区尤物| 久久精品国产亚洲av麻| 一区在线免费观看| 久久精品国产亚洲7777| 四虎影视永久在线精品免费| 亚洲精品tv久久久久| 一级毛片人与动免费观看 | 免费看AV毛片一区二区三区| 永久免费视频网站在线观看| 亚洲国产香蕉碰碰人人| 13一14周岁毛片免费| 亚洲日本在线免费观看| 妞干网免费视频在线观看| 国产成人亚洲精品播放器下载| 免费看国产一级特黄aa大片| 免费看一级一级人妻片| 亚洲无线码在线一区观看| 国产免费无码AV片在线观看不卡| 久久精品亚洲一区二区| 国产精品入口麻豆免费观看| 亚洲色成人网站WWW永久四虎| 午夜爱爱免费视频| 一个人看www免费高清字幕| 亚洲国产精品不卡在线电影| 成人在线免费看片| 国产成人高清亚洲一区久久 | 自拍日韩亚洲一区在线| 日韩免费毛片视频| 中文字幕免费在线看线人动作大片| 亚洲AV日韩AV永久无码久久| 歪歪漫画在线观看官网免费阅读| 亚洲AV一区二区三区四区| 亚洲熟妇av一区二区三区漫画| 日本免费一区二区三区| 亚洲精品精华液一区二区| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲免费二区三区| 一级做a爱过程免费视频高清| 亚洲黄色三级视频| 亚洲成网777777国产精品|