一、概述
REST全稱是Representational State Transfer,中文意思是表述(編者注:通常譯爲表徵)性狀態轉移。
自從Roy Fielding博士在2000年他的博士論文中提出REST(Representational State Transfer)風格的軟件架構模式後,REST就基本上迅速取代了複雜而笨重的SOAP,成爲Web API的標準了。
說白了,我們開發程序時,都有接口對吧,用於前端(包括手機端,網頁等)調用後臺來獲取數據,這個接口規範(怎麼訪問,接口怎麼寫,數據怎麼返回等一系列規範)就是RESTful。
這裏面有一套架構叫做REST,符合這套架構規則的程序就叫做RESTful
二、Rest架構的主要原則
- 網絡上的所有事物都被抽象爲資源
- 每個資源都有一個唯一的資源標識符,即URI
- 同一個資源具有多種表現形式(xml,json等)
- 對資源的各種操作不會改變資源標識符
- 所有的操作都是無狀態的
- 符合REST原則的架構方式即可稱爲RESTful
下面對上面的原則做一些解釋:
資源:比如我們調用接口查詢某種商品的信息,請求返回的商品信息就是資源
資源標識符:
要讓一個資源可以被識別,需要有個唯一標識,在Web中這個唯一標識就是URI(Uniform Resource Identifier)。
URI既可以看成是資源的地址,也可以看成是資源的名稱。如果某些信息沒有使用URI來表示,那它就不能算是一個資源, 只能算是資源的一些信息而已。URI的設計應該遵循可尋址性原則,具有自描述性,需要在形式上給人以直覺上的關聯。
REST主要對以下兩方面進行了規範:
- 定位資源的URL風格,例如
http://bhusk.com/admin/1234
http://bhusk.com/admin/1234/10/11
下面讓我們來看看URI設計上的一些技巧:
- 使用_或-來讓URI可讀性更好:
曾經Web上的URI都是冰冷的數字或者無意義的字符串,但現在越來越多的網站使用_或-來分隔一些單詞,讓URI看上去更爲人性化。 例如國內比較出名的開源中國社區,它上面的新聞地址就採用這種風格, 如http://www.oschina.net/news/38119/oschina-translate-reward-plan。 - 使用/來表示資源的層級關係:
例如上述/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08就表示了一個多級的資源, 指的是git用戶的git項目的某次提交記錄,又例如/orders/2012/10可以用來表示2012年10月的訂單記錄。 - 使用?用來過濾資源
很多人只是把?簡單的當做是參數的傳遞,很容易造成URI過於複雜、難以理解。可以把?用於對資源的過濾, 例如/git/git/pulls用來表示git項目的所有推入請求,而/pulls?state=closed用來表示git項目中已經關閉的推入請求, 這種URL通常對應的是一些特定條件的查詢結果或算法運算結果。 - ,或;可以用來表示同級資源的關係
有時候我們需要表示同級資源的關係時,可以使用,或;來進行分割。例如哪天github可以比較某個文件在隨意兩次提交記錄之間的差異,或許可以使用/git/git /block-sha1/sha1.h/compare/e3af72cdafab5993d18fae056f87e1d675913d08;bd63e61bdf38e872d5215c07b264dcc16e4febca作爲URI。 不過,現在github是使用…來做這個事情的,例如/git/git/compare/master…next。
- 如何對資源操作
採用HTTP協議規定的GET、POST、PUT、DELETE動作處理資源的增刪該查操作
三、什麼是RESTful
對應的中文是rest式的;Restful web service是一種常見的rest的應用,是遵守了rest風格的web服務;rest式的web服務是一種ROA(The Resource-Oriented Architecture)(面向資源的架構).
符合REST約束風格和原則的應用程序或設計就是RESTful.
/emp/1 HTTP GET 查詢id=1的emp
/emp/1 HTTP DELETE 刪除id=1的emp,實驗中直接刪除會報405錯誤,但是採用$.ajax異步刪除就沒問題
/emp/1 HTTP PUT 更新emp
/emp/add HTTP POST 新增emp
四、Spring對RESTful的支持
Spring MVC 對 RESTful應用提供了以下支持:
-
利用@RequestMapping 指定要處理請求的URI模板和HTTP請求的動作類型
-
利用@PathVariable講URI請求模板中的變量映射到處理方法參數上
-
利用Ajax,在客戶端發出PUT、DELETE動作的請求
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String toUpdate(@PathVariable("id") Integer id, Model model) {}
RequestMapping的一般應用格式。
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) // 因爲這個需要Ajax請求,所有返回的是個json
@ResponseBody
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
客戶端發送PUT,DELETE請求
可以採用Ajax方式發送PUT和DELETE請求
$.ajax( {
type : "DELETE",
url : "/spring_crud_restful/emp/deleteEmp/" + id,
dataType : "json",
success : function(data) {
alert(data);
location.href = "/spring_crud_restful/emp/listEmp/1";
}
});