• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      淺談基于SpringMVC的REST功能

      2016-06-14 23:49宋濤徐慶增呂思思
      電腦知識(shí)與技術(shù) 2016年12期

      宋濤+徐慶增+呂思思

      摘要:數(shù)據(jù)為王。作為開發(fā)人員,我們經(jīng)常關(guān)注于構(gòu)建優(yōu)秀的軟件來(lái)解決業(yè)務(wù)問(wèn)題。數(shù)據(jù)只是我們軟件完成工作時(shí)要處理的原材料。但是如果你問(wèn)一下業(yè)務(wù)人員,數(shù)據(jù)和軟件哪個(gè)更重要的話,他們很可能會(huì)選擇數(shù)據(jù)。數(shù)據(jù)是許多業(yè)務(wù)的命脈。軟件通常是可以替換的,但是多年積累的數(shù)據(jù)是永遠(yuǎn)不能替換的。近幾年來(lái),以信息為中心的表述性狀態(tài)轉(zhuǎn)移(Representational State Transfer,REST)已成為替換傳統(tǒng)SOAP web服務(wù)的流行方案,為了幫助spring開發(fā)人員使用REST架構(gòu)模式,spring3.0封裝了對(duì)REST的良好支持。好消息是Spring對(duì)REST的支持是構(gòu)建在SpringMVC之上的,我們將基于了解的SpringMVC知識(shí)來(lái)開發(fā)處理RESTful資源的控制器。

      關(guān)鍵詞:Spring MVC;REST; 表述性狀態(tài)轉(zhuǎn)移

      中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)12-0086-02

      1了解REST

      我敢打賭這并不是你第一次涉及或讀到REST。近年來(lái),關(guān)于REST已經(jīng)有了許多討論,在軟件開發(fā)中你可能會(huì)發(fā)現(xiàn)有一種很流行的做法。那就是在推動(dòng)REST替換SOAP web服務(wù)的時(shí)候,會(huì)談?wù)摰絊OAP的不足。

      誠(chéng)然,對(duì)于許多應(yīng)用程序而言,使用SOAP可能會(huì)有點(diǎn)大材小用了,而REST提供了一個(gè)更簡(jiǎn)單的可選方案。問(wèn)題在于并不是每個(gè)人都清楚地了解REST到底是什么。結(jié)果就出現(xiàn)了許多誤解。在談?wù)揝pring如何支持REST之前,我們需要對(duì)REST是什么達(dá)成共識(shí)。

      2 REST的基本原理

      當(dāng)談?wù)揜EET時(shí),有一種常見(jiàn)的錯(cuò)誤就是將其視為“基于URL的Web服務(wù)”——將REST作為另一種類型的遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)機(jī)制,就像SOAP一樣,只不過(guò)是通過(guò)簡(jiǎn)單的HTTP URL而不是SOAP的大量XML命名空間來(lái)觸發(fā)。

      恰好相反,REST與RPC幾乎沒(méi)有任何關(guān)系,RPC是面向服務(wù)的,并關(guān)注與行為和動(dòng)作。而REST是面向資源的,強(qiáng)調(diào)描述應(yīng)用程序的食物和名詞。

      此外,盡管URL在RSET中起了關(guān)鍵作用,但他們僅僅是整體的一部分而已。

      為了了解REST是什么,我們將它的首字母縮寫拆分為不同的組成部分。

      1) 表述性(Representational)——REST資源實(shí)際上可以用各種形式來(lái)進(jìn)行表述,包括XML,JSON(JavaScript Objict Notation)甚至HTML——最適合資源使用者的任意形式。

      2) 狀態(tài)-(State)—— 當(dāng)使用了REST的時(shí)候,我們更關(guān)注資源的狀態(tài)而不是對(duì)資源采取的行為。

      3) 轉(zhuǎn)移(Transfer)——REST涉及轉(zhuǎn)移資源數(shù)據(jù),它以某一種表述性形式從一個(gè)應(yīng)用轉(zhuǎn)移到了一個(gè)應(yīng)用。

      更簡(jiǎn)潔的講,REST就是將資源的狀態(tài)已最合適的形式從服務(wù)器端轉(zhuǎn)移到客戶端(或者反之)。

      基于對(duì)REST的這種觀點(diǎn),我盡量避免使用諸如REST服務(wù),REST Web服務(wù)或類似的術(shù)語(yǔ),這些術(shù)語(yǔ)會(huì)不恰當(dāng)?shù)貜?qiáng)調(diào)行為。相反,我更愿意強(qiáng)調(diào)REST面向資源的本質(zhì),并談?wù)揜ESTful資源。

      3 Spring是如何支持REST的

      Spring很早就有導(dǎo)出REST資源的需求。Spring3對(duì)Spring MVC的一些增強(qiáng)功能為REST的提供了良好的支持?,F(xiàn)在,Spring支持以下方式來(lái)開發(fā)REST資源。

      1) 控制器可以處理所有的HTTP方法,包含4個(gè)主要的REST方法:GET,PUT,DELETE,以及POST.

      2) 新的@pathVariable注解使得控制器能夠處理參數(shù)化的URL(將變量輸入作為URL的一部分)

      3) Spring的表單綁定JSP標(biāo)簽庫(kù)的標(biāo)簽以及新的hid-denHttpMethodFilter,使得通過(guò)HTML表單提交PUT和DELETE請(qǐng)求成為可能,即便在某些瀏覽器中不支持這些HTTP方法。

      4) 通過(guò)使用Spring的視圖和視圖解析器,資源可以以各種形式進(jìn)行表述,包括將模型數(shù)據(jù)表現(xiàn)為XML,JSON.atom和RSS的新視圖實(shí)現(xiàn)。

      5) 可以使用新的contentNegotiatingViewResolver來(lái)選擇最適合客戶端的表述。

      6) 基于視圖的渲染可以使用新的@ResponseBody注解和各種HttpMethod-Converter實(shí)現(xiàn)來(lái)達(dá)到。

      7) 類似的,新的@ResponseBody注解以及HttpMethod-Converter實(shí)現(xiàn)將傳入的HTTP數(shù)據(jù)轉(zhuǎn)化為傳入控制器處理方法的Java對(duì)象

      8) RestTemplate簡(jiǎn)化了客戶端對(duì)REST資源的使用。

      4 利用HTTP方法來(lái)提交RESTful表單

      我們可以利用4個(gè)主要的HTTP方法(GET、POST、PUT、以及DELETE)來(lái)定義資源的基本操作。通過(guò)適當(dāng)設(shè)置@RequestMapping注解的method屬性,就可以讓DispatcherServlet把不同HTTP方法的請(qǐng)求定向到特定的控制器方法上。Spring MVC能夠處理任意HTTP方法的請(qǐng)求——假設(shè)客戶端能夠以要求的HTTP方法發(fā)送請(qǐng)求。

      這個(gè)規(guī)劃的欠缺之處在于HTML和Web瀏覽器。非瀏覽器的客戶端,如使用RestTemplate,在發(fā)送任意HTTP動(dòng)作方面并沒(méi)有什么問(wèn)題。但是HTML4官方在表單中只支持GET和POST,忽略了PUT,DELETE以及其他的HTTP方法。盡管HTML5和一些新的瀏覽器支持所有的HTTP方法,但是你不能指望應(yīng)用程序的用戶都使用最新的瀏覽器。

      規(guī)避HTML4和較早瀏覽器缺陷的一個(gè)技巧是將PUT或DELETE請(qǐng)求偽裝為POST請(qǐng)求。這種方式提交一個(gè)瀏覽器支持的POST請(qǐng)求,但是會(huì)有一個(gè)隱藏域帶有實(shí)際HTTP方法的名字。當(dāng)請(qǐng)求到達(dá)服務(wù)器端的時(shí)候,它會(huì)重寫為隱藏域指定的請(qǐng)求類型。

      Spring通過(guò)兩個(gè)特性來(lái)支持POST偽裝

      1) 通過(guò)使用HiddenHttpMethodFilter來(lái)進(jìn)行請(qǐng)求轉(zhuǎn)換;

      2) 使用JSP標(biāo)簽渲染隱藏域。

      發(fā)布真正的請(qǐng)求,當(dāng)瀏覽器以PUT或DELETE請(qǐng)求提交渲染所得的表單時(shí),在各個(gè)方面它都是一個(gè)POST請(qǐng)求。它會(huì)作為POST請(qǐng)求通過(guò)網(wǎng)絡(luò),作為POST請(qǐng)求到達(dá)服務(wù)器,除非服務(wù)器上有些東西打斷這個(gè)過(guò)程,并查看_method隱藏域,否則它將作為POST請(qǐng)求來(lái)處理。

      同時(shí),控制器的處理方法使用@RequestMapping注解,在等待處理PUT和DELETE請(qǐng)求。HTTP方法的不匹配問(wèn)題必須在DispatcherServlet查找控制器處理方法之前解決。這就是HiddenHttpMethodFilter所要做的事情。

      5 小結(jié)

      RESTful架構(gòu)使用web標(biāo)準(zhǔn)來(lái)集成應(yīng)用程序,使得交互變得簡(jiǎn)單而自然。系統(tǒng)中的資源采用URL進(jìn)行標(biāo)識(shí),使用HTTP方法進(jìn)行管理,并且會(huì)以一種或多種適合客戶端的方式來(lái)表述。

      為了響應(yīng)這些請(qǐng)求,Spring能夠?qū)①Y源背后的數(shù)據(jù)以最適合客戶端的形式展現(xiàn)。對(duì)于基于視圖的響應(yīng),ContentNegotiatingViewResolver能夠在多個(gè)視圖解析器產(chǎn)生的視圖中選擇最適合客戶端期望內(nèi)容類型的那一個(gè)?;蛘呖刂破鞯奶幚矸椒ㄊ褂聾ResponseBody注解完全繞過(guò)視圖解析,并使用信息轉(zhuǎn)換器將返回值轉(zhuǎn)換為客戶端的響應(yīng)。

      在REST會(huì)話的客戶端,Spring提供了RestTemplate,可以在Java代碼中基于模板的方式使用RESTful資源。如果客戶端是基于瀏覽器的,Spring的HiddenHttpMethodFilter能夠彌補(bǔ)Web瀏覽器不支持PUT和DELETE方法的不足。

      湾仔区| 集贤县| 自治县| 中宁县| 双流县| 乌兰浩特市| 安达市| 浮山县| 文水县| 张家港市| 乐陵市| 盐亭县| 佛学| 镇沅| 林芝县| 江安县| 湘潭县| 平泉县| 扎赉特旗| 安溪县| 綦江县| 昭通市| 宜川县| 离岛区| 北碚区| 瑞丽市| 道孚县| 尼勒克县| 大石桥市| 廊坊市| 岐山县| 宜川县| 三明市| 罗田县| 富源县| 鹤山市| 德保县| 武鸣县| 德昌县| 铜陵市| 扶余县|