什麼是rest?
什麼是rest?當我看到這個詞的時候,我也不知道,我還以爲是休息,最後查了一下,做web開發必須要知道rest
好了,就來簡單介紹一下rest
rest即Representational State Transfer,表現層狀態轉化
互聯網上資源(是服務)細化理解爲一個url,如果訪問某個資源通過http url訪問。
我們把”資源”具體呈現出來的形式,叫做它的”表現層”(Representation)
表現層對用戶展示的形式:html、json、xml、pdf、圖片。。
由於http協議的限制,服務器和客戶端不能實現主動通信,只能有客戶端發起請求服務端響應請求,也就是將請求方法和參數都包含url,
使用rest和不使用rest的規則都是這樣做的,但是rest對於url做了很好的規劃,這個規則將方法和資源分開看起來做的很簡單,但是卻使我們更好理解了,上網無非就是對於網絡資源的操作,網絡資源在internet中直白點說就是url(個人理解)所以如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發生”狀態轉化”(State Transfer)。而這種轉化是建立在表現層之上的,所以就是”表現層狀態轉化”。
GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源
RESTful就是對http最全面最好的詮釋,RESTful就是進行互聯網開發的理念、思想。
1、url規範
原始url:http://www……/queryItems.action?type=101&id=111…
規範後:http://wwww…/item/101/1
比如:
對商品查詢
url:http://wwww…/item/101/1 表示對101分類 下的1號商品查詢
http請求方法設置爲get
比如:
對商品刪除
url:http://wwww…/item/101/1表示對101分類 下的1號商品刪除
http請求方法設置爲delete
rest向客戶端發送數據
在請求時指定服務端給客戶端響應的內容類型是什麼?
實現:在請求時設置http頭中Accept
對商品查詢,以json格式展示:
rest設置:
url爲:http://wwww…/item/101/1
客戶端請求此url並且設置Accept爲”applicatoin/json”
服務端處理方法:
接收請求,解析Accept,根據指定類型返回不同的內容格式。
如果解析到Accept爲”applicatoin/json”,服務端就將內容轉成json輸出
如果解析到Accept爲”applicatoin/xml”,服務端就將內容轉成xml輸出
RESTful架構的特點:
綜合上面的解釋,我們總結一下什麼是RESTful架構:
(1)每一個URI代表一種資源;
實現:
規範後的url規範後:http://wwww…/item/101/1,特點是參數通過url傳遞。
(2)客戶端和服務器之間,傳遞這種資源的某種表現層;
實現:
服務端解析Accept,根據客戶端的要求將內容進行輸出。
(3)客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現”表現層狀態轉化”。
實現:
服務解析客戶端請求的http方法,根據不同的方法執行不同的service操作。
rest在spingmvc中實際操作
1.首先在web.xml中配置支持rest風格的前端控制器,即過濾所有路徑
<!-- 配置springmvc的rest風格的url解析, -->
<servlet>
<servlet-name>springmvc-rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始參數 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc-rest</servlet-name>
<!-- 注意這個是重點 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
編寫支持rest的controler方法,使用註解完成,簡單:
package com.leige.controler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.leige.domain.Student;
import com.leige.service.StudentService;
@Controller
@RequestMapping("/rest")
public class RestControler {
//注入service
@Autowired
@Qualifier(value="studentService")
StudentService studentService;
/**
* @param sid
* @return返回json
*
*
* @PathVariable將url中的路作爲參數賦給方法
* ,注意路徑使用佔位符
*/
@RequestMapping(value="/testRest/{sid}")
public @ResponseBody Student testRest(@PathVariable("sid")Integer sid){
return studentService.selectStudent(sid);
};
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
測試結果:
重要的是理解rest的設計思想,rest的思想講解:http://www.ruanyifeng.com/blog/2014/05/restful_api.html