Restful風格的API是一種軟件架構風格,設計風格而不是標准,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。
在Restful風格中,用戶請求的url使用同一個url而用請求方式:get,post,delete,put...等方式對請求的處理方法進行區分,這樣可以在前後台分離式的開發中使得前端開發人員不會對請求的資源地址產生混淆和大量的檢查方法名的麻煩,形成一個統一的接口。
在Restful風格中,現有規定如下:
了解這個風格定義以後,我們舉個例子:
如果當前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修飾的方法進行訪問,這樣我們上面定義的控制器類已經可以實現了。
本文為七小站主原創作品,轉載請注明出處:http://www.cnblogs.com/qixiaoyizhan/ 且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。