?

淺談基于SpringMVC的REST功能

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

宋濤+徐慶增+呂思思

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

關鍵詞:Spring MVC;REST; 表述性狀態轉移

中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2016)12-0086-02

1了解REST

我敢打賭這并不是你第一次涉及或讀到REST。近年來,關于REST已經有了許多討論,在軟件開發中你可能會發現有一種很流行的做法。那就是在推動REST替換SOAP web服務的時候,會談論到SOAP的不足。

誠然,對于許多應用程序而言,使用SOAP可能會有點大材小用了,而REST提供了一個更簡單的可選方案。問題在于并不是每個人都清楚地了解REST到底是什么。結果就出現了許多誤解。在談論Spring如何支持REST之前,我們需要對REST是什么達成共識。

2 REST的基本原理

當談論REET時,有一種常見的錯誤就是將其視為“基于URL的Web服務”——將REST作為另一種類型的遠程過程調用(Remote Procedure Call,RPC)機制,就像SOAP一樣,只不過是通過簡單的HTTP URL而不是SOAP的大量XML命名空間來觸發。

恰好相反,REST與RPC幾乎沒有任何關系,RPC是面向服務的,并關注與行為和動作。而REST是面向資源的,強調描述應用程序的食物和名詞。

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

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

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

2) 狀態-(State)—— 當使用了REST的時候,我們更關注資源的狀態而不是對資源采取的行為。

3) 轉移(Transfer)——REST涉及轉移資源數據,它以某一種表述性形式從一個應用轉移到了一個應用。

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

基于對REST的這種觀點,我盡量避免使用諸如REST服務,REST Web服務或類似的術語,這些術語會不恰當地強調行為。相反,我更愿意強調REST面向資源的本質,并談論RESTful資源。

3 Spring是如何支持REST的

Spring很早就有導出REST資源的需求。Spring3對Spring MVC的一些增強功能為REST的提供了良好的支持?,F在,Spring支持以下方式來開發REST資源。

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

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

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

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

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

6) 基于視圖的渲染可以使用新的@ResponseBody注解和各種HttpMethod-Converter實現來達到。

7) 類似的,新的@ResponseBody注解以及HttpMethod-Converter實現將傳入的HTTP數據轉化為傳入控制器處理方法的Java對象

8) RestTemplate簡化了客戶端對REST資源的使用。

4 利用HTTP方法來提交RESTful表單

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

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

規避HTML4和較早瀏覽器缺陷的一個技巧是將PUT或DELETE請求偽裝為POST請求。這種方式提交一個瀏覽器支持的POST請求,但是會有一個隱藏域帶有實際HTTP方法的名字。當請求到達服務器端的時候,它會重寫為隱藏域指定的請求類型。

Spring通過兩個特性來支持POST偽裝

1) 通過使用HiddenHttpMethodFilter來進行請求轉換;

2) 使用JSP標簽渲染隱藏域。

發布真正的請求,當瀏覽器以PUT或DELETE請求提交渲染所得的表單時,在各個方面它都是一個POST請求。它會作為POST請求通過網絡,作為POST請求到達服務器,除非服務器上有些東西打斷這個過程,并查看_method隱藏域,否則它將作為POST請求來處理。

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

5 小結

RESTful架構使用web標準來集成應用程序,使得交互變得簡單而自然。系統中的資源采用URL進行標識,使用HTTP方法進行管理,并且會以一種或多種適合客戶端的方式來表述。

為了響應這些請求,Spring能夠將資源背后的數據以最適合客戶端的形式展現。對于基于視圖的響應,ContentNegotiatingViewResolver能夠在多個視圖解析器產生的視圖中選擇最適合客戶端期望內容類型的那一個?;蛘呖刂破鞯奶幚矸椒ㄊ褂聾ResponseBody注解完全繞過視圖解析,并使用信息轉換器將返回值轉換為客戶端的響應。

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

91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合