国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺談基于SpringMVC的REST功能

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

宋濤+徐慶增+呂思思

摘要:數(shù)據(jù)為王。作為開(kāi)發(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à),他們很可能會(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開(kāi)發(fā)人員使用REST架構(gòu)模式,spring3.0封裝了對(duì)REST的良好支持。好消息是Spring對(duì)REST的支持是構(gòu)建在SpringMVC之上的,我們將基于了解的SpringMVC知識(shí)來(lái)開(kāi)發(fā)處理RESTful資源的控制器。

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

中圖分類(lèi)號(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)有了許多討論,在軟件開(kāi)發(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作為另一種類(lèi)型的遠(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是什么,我們將它的首字母縮寫(xiě)拆分為不同的組成部分。

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)移到客戶(hù)端(或者反之)。

基于對(duì)REST的這種觀點(diǎn),我盡量避免使用諸如REST服務(wù),REST Web服務(wù)或類(lèi)似的術(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)開(kā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)選擇最適合客戶(hù)端的表述。

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

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

8) RestTemplate簡(jiǎn)化了客戶(hù)端對(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è)客戶(hù)端能夠以要求的HTTP方法發(fā)送請(qǐng)求。

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

規(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ì)重寫(xiě)為隱藏域指定的請(qǐng)求類(lèi)型。

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ì)以一種或多種適合客戶(hù)端的方式來(lái)表述。

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

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

江津市| 二连浩特市| 睢宁县| 忻州市| 西昌市| 浮梁县| 白朗县| 古丈县| 洛隆县| 株洲县| 开鲁县| 都匀市| 察隅县| 正蓝旗| 望江县| 昭平县| 南投市| 盐山县| 惠安县| 焦作市| 十堰市| 长宁县| 若尔盖县| 伊通| 峨眉山市| 碌曲县| 开阳县| 双流县| 尤溪县| 拉孜县| 辽阳市| 简阳市| 五常市| 衡南县| 东城区| 鄂伦春自治旗| 梁河县| 青龙| 台南市| 兰西县| 邳州市|