<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 :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

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

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

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


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


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

    可尋址性(Addressability)

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

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

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

    面向表象(Representation-Oriented)

    表象這個詞有點拗口,傳聞在一個 REST 風(fēng)格的系統(tǒng)中,服務(wù)端和客戶端之間傳輸?shù)倪诉司褪潜硐蟆硐罂梢允羌兾谋尽ML、JSON……或者自編的山寨格式。唉,不就是數(shù)據(jù)么?只不過可以用任意的格式來傳輸,因為 HTTP 正文里面啥都能放。Content-Type 頭用來聲明格式,一般是 MIME(多用途因特網(wǎng)郵件擴展),像 text/plaintext/htmlapplication/pdf 這些。MIME 可以帶屬性,例如 text/html; charset=UTF-8

    無態(tài)通信(Communicate Statelessly)

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

    HATEOAS

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

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


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


    評論

    # re: JAX-RS 從傻逼到牛逼 1:REST 基礎(chǔ)知識  回復(fù)  更多評論   

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

    # re: JAX-RS 從傻逼到牛逼 1:REST 基礎(chǔ)知識  回復(fù)  更多評論   

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

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

    2011-12-05 17:32 by 天空布藍(lán)
    沒有看懂。。。。
    主站蜘蛛池模板: 中文字幕亚洲一区| 亚洲av日韩综合一区二区三区| 亚洲色av性色在线观无码| 亚洲国产日韩精品| 在线观看人成视频免费无遮挡| 亚洲精品第一国产综合境外资源| 亚洲午夜在线电影| 久久精品免费观看国产| 免费看国产一级片| 国产精品亚洲一区二区三区| 免费国产不卡午夜福在线| 日韩精品无码永久免费网站| 亚洲日韩国产精品乱| 特级毛片爽www免费版| 亚洲午夜久久久久久久久久| 麻豆精品成人免费国产片| 亚洲国产美国国产综合一区二区| 久9热免费精品视频在线观看| 亚洲小说区图片区| 免费无码又爽又刺激高潮| 特级aa**毛片免费观看| 亚洲色成人中文字幕网站| 最近中文字幕国语免费完整| 国产亚洲精品xxx| 99久热只有精品视频免费观看17| 亚洲乱码一二三四五六区| 成人性做爰aaa片免费看| 成人亚洲网站www在线观看| 自拍偷区亚洲国内自拍| 国产又粗又猛又爽又黄的免费视频| 日韩精品免费一线在线观看| 亚洲AV永久无码精品| 男人的好免费观看在线视频| 色婷婷精品免费视频| 亚洲AV午夜成人影院老师机影院| 国产曰批免费视频播放免费s| 国产成人高清亚洲一区久久 | 亚洲永久无码3D动漫一区| 中国人xxxxx69免费视频| 亚洲精华液一二三产区| 日韩精品福利片午夜免费观着 |