Restful風格API接口開發springMVC篇 Restful風格的API是一種軟件架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件能夠更簡潔,更有層次,更易於實現緩存等機制。 在Restful風格中,用戶請求的url使用同一個url而用請求方式:get,post,delete,put...等方式對請求的處理方法進行區分,這樣能夠在先後臺分離式的開發中使得前端開發人員不會對請求的資源地址產生混淆和大量的檢查方法名的麻煩,造成一個統一的接口。 在Restful風格中,現有規定以下: GET(SELECT):從服務器查詢,能夠在服務器經過請求的參數區分查詢的方式。 POST(CREATE):在服務器新建一個資源,調用insert操做。 PUT(UPDATE):在服務器更新資源,調用update操做。 PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。(目前jdk7未實現,tomcat7也不行)。 DELETE(DELETE):從服務器刪除資源,調用delete語句。 瞭解這個風格定義之後,咱們舉個例子: 若是當前url是 http://localhost:8080/User 那麼用戶只要請求這樣同一個URL就能夠實現不一樣的增刪改查操做,例如 http://localhost:8080/User?_method=get&id=1001 這樣就能夠經過get請求獲取到數據庫 user 表裏面 id=1001 的用戶信息 http://localhost:8080/User?_method=post&id=1001&name=zhangsan 這樣能夠向數據庫 user 表裏面插入一條記錄 http://localhost:8080/User?_method=put&id=1001&name=lisi 這樣能夠將 user表裏面 id=1001 的用戶名改成lisi http://localhost:8080/User?_method=delete&id=1001 這樣用於將數據庫 user 表裏面的id=1001 的信息刪除 這樣定義的規範咱們就能夠稱之爲restful風格的API接口,咱們能夠經過同一個url來實現各類操做。 接下來咱們講解spring-mvc中是如何實現restful風格API接口的,而且對其中出現的問題進行解決!(java web對 put 和 delete 請求的不支持問題) 首先咱們搭建好spring mvc的項目接口,並按照restful風格寫好控制器,這裏我寫了一個User控制器類和一個User "Action" -> |
這裏的controller 和 action的url地址是按照restful風格編寫的 訪問地址 /User/User 用method區分請求方法 咱們的前臺使用的是jquery ajax進行請求-> |
有人會問了? 爲何delete 和put用的也是post的請求,這裏就要說說java裏面對put和delete的不支持了-> java裏面本來是對put和delete請求進行過濾掉的(不知道爲何要這麼作),並且在servlet裏面還有doGet,doPost,doDelete,doPut的對應方法,可是不可使用(尷尬不尷尬),一樣spring mvc裏面也有對應的method=RequestMethod.PUT 和Delete,可是ajax裏面type寫成Put、Delete是能夠訪問到對應的方法的,可是參數卻沒法傳遞過去,全部傳遞過去的參數都是null(鬱悶不鬱悶)!C#就不會這樣,C#的API編程須要開啓一下PUT和Delete就能夠了,並不須要java裏面這麼複雜,說到這裏咱們解決一下這個問題-> 首先在springMVC 項目的Web.xml裏面增長一個過濾器filter 1 <!-- 瀏覽器不支持put,delete等method,由該filter將/xxx?_method=delete轉換爲標準的http delete方法 --> 2 <filter> 3 <filter-name>hiddenHttpMethodFilter</filter-name> 4 <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>hiddenHttpMethodFilter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping> 固然有些新手不知道這段代碼加在哪裏,那麼我就將個人web.xml一併粘貼在此處(我也搞這個半天...) 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 5 version="3.0"> 6 7 <!-- 瀏覽器不支持put,delete等method,由該filter將/xxx?_method=delete轉換爲標準的http delete方法 --> 8 <filter> 9 <filter-name>hiddenHttpMethodFilter</filter-name> 10 <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 11 </filter> 12 <filter-mapping> 13 <filter-name>hiddenHttpMethodFilter</filter-name> 14 <url-pattern>/*</url-pattern> 15 </filter-mapping> 16 17 <!--這段代碼若是不用上面的的話是能夠實現put的--> 18 <!--<filter> 19 <filter-name>HttpMethodPutFilter</filter-name> 20 <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> 21 </filter> 22 <filter-mapping> 23 <filter-name>HttpMethodPutFilter</filter-name> 24 <url-pattern>/*</url-pattern> 25 </filter-mapping>--> 26 27 28 <welcome-file-list> 29 <welcome-file>/index.jsp</welcome-file> 30 </welcome-file-list> 31 <!-- Spring MVC配置 --> 32 <servlet> 33 <servlet-name>spring</servlet-name> 34 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 35 36 <!-- load-on-startup元素標記容器是否在啓動的時候就加載這個servlet(實例化並調用其init()方法) --> 37 <load-on-startup>1</load-on-startup> 38 </servlet> 39 40 <servlet-mapping> 41 <servlet-name>spring</servlet-name> 42 <url-pattern>/</url-pattern> 43 </servlet-mapping> 44 45 <!-- Spring配置 --> 46 <listener> 47 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 48 </listener> 49 50 <!-- 指定Spring Bean的配置文件所在目錄。默認配置在WEB-INF目錄下 --> 51 <context-param> 52 <param-name>contextConfigLocation</param-name> 53 <param-value>classpath:applicationContext.xml</param-value> 54 </context-param> 55 </web-app> 這裏咱們將過濾器配置好了,我有一段註釋掉了,若是用下面這個配置文件-> 1 <!--這段代碼若是不用上面的的話是能夠實現put的--> 2 <filter> 3 <filter-name>HttpMethodPutFilter</filter-name> 4 <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>HttpMethodPutFilter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping> 這個配置項若是寫在這裏的話是能夠支持PUT請求的,可是DELETE請求依然不能夠,那麼我只能選擇第一種方法了 1 <filter> 2 <filter-name>hiddenHttpMethodFilter</filter-name> 3 <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>hiddenHttpMethodFilter</filter-name> 7 <url-pattern>/*</url-pattern> 8 </filter-mapping> 這一段的方法是用 org.springframework.web.filter.HiddenHttpMethodFilter 的內置過濾器類進行對http請求的標準化。這樣讓咱們能夠本身聲明請求的方式。 配置完成這個之後,咱們在ajax裏面須要傳遞一個參數_method:"PUT" 和 _method:"DELETE",可是請求方式仍然是POST |
這樣配置的話,咱們已經能夠實現對DELETE修飾的方法進行訪問,一樣_method:'PUT'咱們能夠對PUT修飾的方法進行訪問,這樣咱們上面定義的控制器類已經能夠實現了。 |