關(guān)于SpringMVC對Restful風(fēng)格的支持詳解
前言
RESTFUL是一種網(wǎng)絡(luò)應(yīng)用程序的設(shè)計風(fēng)格和開發(fā)方式,基于HTTP,可以使用XML格式定義或JSON格式定義。
一、RESTful簡介
REST:Representational State Transfer,表現(xiàn)層資源狀態(tài)轉(zhuǎn)移。
1.1、資源
資源是一種看待服務(wù)器的方式。即,將服務(wù)器看作是由很多離散的資源組成。
每個資源是服務(wù)器上一個可命名的抽象概念。
因為資源是一個抽象的概念,所以它不僅僅能代表服務(wù)器文件系統(tǒng)中的一個文件、數(shù)據(jù)庫中的一張表等等具體的東西,可以將資源設(shè)計的要多抽象有多抽象,只要想象力允許而且客戶端應(yīng)用開發(fā)者能夠理解。
與面向?qū)ο笤O(shè)計類似,資源是以名詞為核心來組織的,首先關(guān)注的是名詞。
一個資源可以由一個或多個URI來標(biāo)識。URI既是資源的名稱,也是資源在Web上的地址。對某個資源感興趣的客戶端應(yīng)用,可以通過資源的URI與其進(jìn)行交互。
1.2、資源的表述
資源的表述是一段對于資源在某個特定時刻的狀態(tài)的描述??梢栽诳蛻舳?服務(wù)器端之間轉(zhuǎn)移(交換)。
資源的表述可以有多種格式,例如HTML/XML/JSON/純文本/圖片/視頻/音頻等等。
資源的表述格式可以通過協(xié)商機(jī)制來確定。請求-響應(yīng)方向的表述通常使用不同的格式。
1.3、狀態(tài)轉(zhuǎn)移
狀態(tài)轉(zhuǎn)移說的是:在客戶端和服務(wù)器端之間轉(zhuǎn)移(transfer)代表資源狀態(tài)的表述。通過轉(zhuǎn)移和操作資源的表述,來間接實現(xiàn)操作資源的目的。
RESTful規(guī)范
1、對URL進(jìn)行規(guī)范,寫RESTful格式的URL
非REST的URL:http://..../queryItems.action?id=001
REST的URL風(fēng)格:http://..../items/001
特點:URL簡潔,將參數(shù)通過URL傳到服務(wù)端,請求URL只是對資源的定位,因此不應(yīng)該出現(xiàn)動詞
2、http的方法規(guī)范
不管是刪除、添加、更新,使用的URL是一致的,如果進(jìn)行刪除,需設(shè)置HTTP的方法為delete,其它同理
后臺controller方法:判斷http方法,如果是delete則執(zhí)行刪除,如果是post則執(zhí)行添加
3、對http的contentType規(guī)范
請求時執(zhí)行contentType,要json數(shù)據(jù),則設(shè)置成json格式的type
而實際使用中第2點往往沒有做到
二、RESTful的實現(xiàn)
具體說,就是 HTTP 協(xié)議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。
它們分別對應(yīng)四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。
REST 風(fēng)格提倡 URL 地址使用統(tǒng)一的風(fēng)格設(shè)計,從前到后各個單詞使用斜杠分開,不使用問號鍵值對方式攜帶請求參數(shù),而是將要發(fā)送給服務(wù)器的數(shù)據(jù)作為 URL 地址的一部分,以保證整體風(fēng)格的一致性。
操作 | 傳統(tǒng)方式 | REST風(fēng)格 |
---|---|---|
查詢操作 | getUserById?id=1 | user/1–>get請求方式 |
保存操作 | saveUser | user–>post請求方式 |
刪除操作 | deleteUser?id=1 | user/1–>delete請求方式 |
更新操作 | updateUser | user–>put請求方式 |
三、HiddenHttpMethodFilter
Q:由于瀏覽器只支持發(fā)送get和post方式的請求,那么該如何發(fā)送put和delete請求呢?
A:SpringMVC 提供了 HiddenHttpMethodFilter 幫助我們將 POST 請求轉(zhuǎn)換為 DELETE 或 PUT 請求。
3.1、HiddenHttpMethodFilter 過濾器處理put和delete請求
要求:
- 當(dāng)前請求的請求方式必須為post。
- 當(dāng)前通過post請求封裝的實際請求方式通過請求參數(shù)_method傳輸。
HiddenHttpMethodFilter 過濾器就會將當(dāng)前請求的請求方式轉(zhuǎn)換為請求參數(shù)_method的值,因此請求參數(shù)_method的值才是最終的請求方式。
3.2、在web.xml中注冊HiddenHttpMethodFilter
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3.3、過濾器的先后配置順序
當(dāng) SpringMVC中提供了兩個過濾器:CharacterEncodingFilter和HiddenHttpMethodFilter 在web.xml中注冊時,必須先注冊CharacterEncodingFilter,再注冊HiddenHttpMethodFilter。
原因:
在 CharacterEncodingFilter 中通過 request.setCharacterEncoding(encoding)
方法設(shè)置字符集的 request.setCharacterEncoding(encoding)
方法要求前面不能有任何獲取請求參數(shù)的操作。
而 HiddenHttpMethodFilter 恰恰有一個獲取請求方式的操作:String paramValue = request.getParameter(this.methodParam);
總結(jié)
到此這篇關(guān)于SpringMVC對Restful風(fēng)格支持的文章就介紹到這了,更多相關(guān)SpringMVC對Restful風(fēng)格的支持內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringMVC?Restful風(fēng)格與中文亂碼問題解決方案介紹
- SpringMVC通過RESTful結(jié)構(gòu)實現(xiàn)頁面數(shù)據(jù)交互
- SpringMVC?RESTFul及REST架構(gòu)風(fēng)格介紹
- SpringMVC?RESTFul實體類創(chuàng)建及環(huán)境搭建
- SpringMVC?RESTFul實戰(zhàn)案例訪問首頁
- SpringMVC?RESTFul實現(xiàn)列表功能
- SpringMVC?RESTFul實戰(zhàn)案例刪除功能實現(xiàn)
- SpringMVC?RESTFul實戰(zhàn)案例修改功能實現(xiàn)
- SpringMVC使用RESTful接口案例詳解
相關(guān)文章
淺談maven的jar包和war包區(qū)別 以及打包方法
下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價值,希望對大家有所幫助2017-11-11Springboot實現(xiàn)ENC加密的詳細(xì)流程
在項目開發(fā)過程中,需要配置數(shù)據(jù)庫連接密碼、Redis密碼、網(wǎng)盤上傳的AK/SK等敏感信息,都需要保存在配置文件里,或者配置中心,這些信息如果泄露,還是會造成一定的困擾,下面這篇文章主要給大家介紹了關(guān)于Springboot實現(xiàn)ENC加密的詳細(xì)流程,需要的朋友可以參考下2023-06-06mybatis條件語句中帶數(shù)組參數(shù)的處理
這篇文章主要介紹了mybatis條件語句中帶數(shù)組參數(shù)的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09springboot接收日期字符串參數(shù)與返回日期字符串類型格式化
這篇文章主要介紹了springboot接收日期字符串參數(shù)與返回日期字符串類型格式化,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01java中的編碼轉(zhuǎn)換過程(以utf8和gbk為例)
這篇文章主要介紹了java中的編碼轉(zhuǎn)換過程(以utf8和gbk為例),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04