Restful風(fēng)格
1、Restful 風(fēng)格的介紹
Restful 一種軟件架構(gòu)風(fēng)格、設(shè)計(jì)風(fēng)格,而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原則和約束條件。它主要用于客戶端和服務(wù)器交互類的軟件。基于這個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡潔,更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制。
REST(英文:Representational State Transfer,簡稱REST)描述了一個(gè)架構(gòu)樣式的網(wǎng)絡(luò)系統(tǒng),比如 web 應(yīng)用程序。它首次出現(xiàn)在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規(guī)范的主要編寫者之一。在目前主流的三種Web服務(wù)交互方案中,REST相比于SOAP(Simple Object Access protocol,簡單對(duì)象訪問協(xié)議)以及XML-RPC更加簡單明了,無論是對(duì)URL的處理還是對(duì)Payload的編碼,REST都傾向于用更加簡單輕量的方法設(shè)計(jì)和實(shí)現(xiàn)。值得注意的是REST并沒有一個(gè)明確的標(biāo)準(zhǔn),而更像是一種設(shè)計(jì)的風(fēng)格。
原則條件
REST 指的是一組架構(gòu)約束條件和原則。滿足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是 RESTful。
Web 應(yīng)用程序最重要的 REST 原則是,客戶端和服務(wù)器之間的交互在請(qǐng)求之間是無狀態(tài)的。從客戶端到服務(wù)器的每個(gè)請(qǐng)求都必須包含理解請(qǐng)求所必需的信息。如果服務(wù)器在請(qǐng)求之間的任何時(shí)間點(diǎn)重啟,客戶端不會(huì)得到通知。此外,無狀態(tài)請(qǐng)求可以由任何可用服務(wù)器回答,這十分適合云計(jì)算之類的環(huán)境??蛻舳丝梢跃彺鏀?shù)據(jù)以改進(jìn)性能。
在服務(wù)器端,應(yīng)用程序狀態(tài)和功能可以分為各種資源。資源是一個(gè)有趣的概念實(shí)體,它向客戶端公開。資源的例子有:應(yīng)用程序?qū)ο?、?shù)據(jù)庫記錄、算法等等。每個(gè)資源都使用 URI (Universal Resource Identifier) 得到一個(gè)唯一的地址。所有資源都共享統(tǒng)一的接口,以便在客戶端和服務(wù)器之間傳輸狀態(tài)。使用的是標(biāo)準(zhǔn)的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是應(yīng)用程序狀態(tài)的引擎,資源表示通過超鏈接互聯(lián)。
Restful是一種設(shè)計(jì)風(fēng)格。對(duì)于我們Web開發(fā)人員來說。就是使用一個(gè)url地址表示一個(gè)唯一的資源。然后把原來的請(qǐng)求參數(shù)加入到請(qǐng)求資源地址中。然后原來請(qǐng)求的增,刪,改,查操作。改為使用HTTP協(xié)議中請(qǐng)求方式GET、POST、PUT、DELETE表示。
1、把請(qǐng)求參數(shù)加入到請(qǐng)求的資源地址中
2、原來的增,刪,改,查。使用HTTP請(qǐng)求方式,POST、DELETE、PUT、GET分別一一對(duì)應(yīng)。
2、如何學(xué)習(xí)restful風(fēng)格
2.1、就是把傳統(tǒng)的請(qǐng)求參數(shù)加入到請(qǐng)求地址是什么樣子?
傳統(tǒng)的方式是:
比如:http://ip:port/工程名/資源名?請(qǐng)求參數(shù)
舉例:http://127.0.0.1:8080/springmvc/book?action=delete&id=1
restful風(fēng)格是:
比如:http://ip:port/工程名/資源名/請(qǐng)求參數(shù)/請(qǐng)求參數(shù)
舉例:http://127.0.0.1:8080/springmvc/book/1
請(qǐng)求的動(dòng)作刪除由請(qǐng)求方式delete決定
2.2、restful風(fēng)格中請(qǐng)求方式GET、POST、PUT、DELETE分別表示查、增、改、刪
GET請(qǐng)求 對(duì)應(yīng) 查詢
http://ip:port/工程名/book/1 HTTP請(qǐng)求GET 表示要查詢id為1的圖書
http://ip:port/工程名/book HTTP請(qǐng)求GET 表示查詢?nèi)康膱D書
POST請(qǐng)求 對(duì)應(yīng) 添加
http://ip:port/工程名/book HTTP請(qǐng)求POST 表示要添加一個(gè)圖書
PUT請(qǐng)求 對(duì)應(yīng) 修改
http://ip:port/工程名/book/1 HTTP請(qǐng)求PUT 表示要修改id為1的圖書信息
DELETE請(qǐng)求 對(duì)應(yīng) 刪除
http://ip:port/工程名/book/1 HTTP請(qǐng)求DELETE 表示要?jiǎng)h除id為1的圖書信息
2.3、SpringMVC中如何發(fā)送GET請(qǐng)求、POST請(qǐng)求、PUT請(qǐng)求、DELETE請(qǐng)求
我們知道發(fā)起GET請(qǐng)求和POST請(qǐng)求,只需要在表單的form標(biāo)簽中,設(shè)置method=”get” 就是GET請(qǐng)求。
設(shè)置form標(biāo)簽的method=”post”。就會(huì)發(fā)起POST請(qǐng)求。而PUT請(qǐng)求和DELETE請(qǐng)求。要如何發(fā)起呢。
1、要有post請(qǐng)求的form標(biāo)簽
2、在form表單中,添加一個(gè)額外的隱藏域_method=”PUT”或_method=”DELETE”
3、在web.xml中配置一個(gè)Filter過濾器org.springframework.web.filter.HiddenHttpMethodFilter
(注意,這個(gè)Filter一定要在處理亂碼的Filter后面)
3、Restful風(fēng)格的Controller如何實(shí)現(xiàn)
客戶端表單:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>restful首頁</title>
</head>
<body>
restful首頁 <br><br>
<a href="${pageContext.request.contextPath}/person/1">查詢一個(gè)用戶</a> <br>
<a href="${pageContext.request.contextPath}/person">查詢?nèi)坑脩?span id="n5n3t3z" class="token operator"></a> <br>
<form action="${pageContext.request.contextPath}/person" method="post">
<input type="submit" value="添加用戶">
</form>
<%--
如果要實(shí)現(xiàn)put請(qǐng)求或delete請(qǐng)求,需要完成以下幾個(gè)步驟: <br/>
1 有一個(gè)post請(qǐng)求的form表單 <br/>
2 添加隱藏域 name="_method" value="PUT|DELETE" 用于表示相應(yīng)的請(qǐng)求 <br/>
3 在web.xml中配置支持restful風(fēng)格的Filter過濾器
--%>
<form action="${pageContext.request.contextPath}/person/1" method="post">
<input type="hidden" name="_method" value="PUT" />
<input type="submit" value="修改用戶">
</form>
<form action="${pageContext.request.contextPath}/person/1" method="post">
<input type="hidden" name="_method" value="DELETE" />
<input type="submit" value="刪除用戶">
</form>
</body>
</html>
Controller中的代碼:
@Controller
public class RestController {
@RequestMapping(value = "/person/1", method = RequestMethod.GET)
public String queryPersonById() {
System.out.println("這是查詢id為1的用戶");
return "redirect:/index.jsp";
}
@RequestMapping(value = "/person", method = RequestMethod.GET)
public String queryPersons() {
System.out.println("這是查詢?nèi)康挠脩?);
return "redirect:/index.jsp";
}
@RequestMapping(value = "/person", method = RequestMethod.POST)
public String addPerson() {
System.out.println("添加用戶");
return "redirect:/index.jsp";
}
@RequestMapping(value = "/person/1", method = RequestMethod.PUT)
public String updatePerson() {
System.out.println("修改用戶");
return "redirect:/index.jsp";
}
@RequestMapping(value = "/person/1", method = RequestMethod.DELETE)
public String deletePerson() {
System.out.println("刪除用戶");
return "redirect:/index.jsp";
}
}
4、Restful風(fēng)格在高版本Tomcat中無法轉(zhuǎn)發(fā)到j(luò)sp頁面
在Tomcat8之后的一些高版本,使用restful風(fēng)格訪問然后轉(zhuǎn)發(fā)到j(luò)sp頁面。就會(huì)有如下的錯(cuò)誤提示:
1 在轉(zhuǎn)發(fā)去的頁面中,添加屬性isErrorPage=“true”
2 使用重定向來進(jìn)行跳轉(zhuǎn)
5、@PathVariable 路徑參數(shù)獲取
前面我們已經(jīng)知道如何編寫和配置restful風(fēng)格的請(qǐng)求和控制器。
那么 現(xiàn)在的問題是。如何接收restful風(fēng)格請(qǐng)求的參數(shù)。比如前面的id值。文章來源:http://www.zghlxwxcb.cn/news/detail-474750.html
一個(gè)變量的情況:文章來源地址http://www.zghlxwxcb.cn/news/detail-474750.html
/**
* value = "/person/{id}" 中 {id} 是路徑變量<br/>
* 而{id}變量中的id是變量名 <br/>
* @PathVariable("id") Integer id 表示把路徑變量id的值賦給參數(shù)id
*/
@RequestMapping(value = "/person/{id}", method = RequestMethod.GET)
public String queryPersonById(@PathVariable("id") Integer id) {
System.out.println("這是查詢id為1的用戶 ===>>> " + id);
return "redirect:/index.jsp";
}
到了這里,關(guān)于SpringMVC第八階段:Restful風(fēng)格的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!