1. 程式人生 > >【spring springmvc】這裡有你想要的SpringMVC的REST風格的四種請求方式

【spring springmvc】這裡有你想要的SpringMVC的REST風格的四種請求方式

# 概述 之前的文章[springmvc使用註解宣告控制器與請求對映](https://blog.csdn.net/qq_41929184/article/details/104997012)有簡單提到過控制器與請求對映,這一次就詳細講解一下`SpringMVC`的`REST`風格的四種請求方式及其使用方法。 ## 你能get的知識點 1、什麼是Rest風格? 2、基於`springmvc`實現REST風格的四種請求方式 3、post請求轉換為`delete`與`put`請求 4、解決請求亂碼問題 5、`RequestMapping`註解的屬性 @[TOC] ![](https://img-blog.csdnimg.cn/20200329130918103.png) # 壹:rest風格 ## 一:什麼是Rest風格? REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟體架構風格。它是一種針對網路應用的設計和開發方式,可以降低開發的複雜性,提高系統的可伸縮性。 簡單來說:使用URL定位資源,用HTTP動詞(例如GET,POST,DELETE,DETC等)描述操作。 ## 二:REST風格的四種請求方式 請求 | 說明 | 用於|例子|例子說明 ----|----|---|--|-- @GetMapping|匹配GET方式的請求;| 一般用於讀取資料| /user/1|獲取一號使用者資訊 @PostMapping|匹配POST方式的請求;| 一般用於新增資料 |/user/1|新增一號使用者 @PutMapping|匹配PUT方式的請求;| 一般用於更新資料|/user/1|修改一號使用者 @DeleteMapping|匹配DELETE方式的請求;|一般用於刪除資料|/user/1|刪除一號使用者 也就是說,我們不再使用`/user/getuser?user=1`、`/user/deleteuser?user=1`等來區分使用者的行為操作,而是使用不同的請求方式來描述行為。 # 貳:基於`springmvc`實現REST風格的四種請求方式 Spring框架的4.3版本後,引入了新的組合註解,來幫助簡化常用的`HTTP`方法的對映,並更好的表達被註解方法的語義。 ``` @GetMapping = @requestMapping(method = RequestMethod.GET)。 @PostMapping = @requestMapping(method = RequestMethod.POST)。 @DeleteMapping = @requestMapping(method = RequestMethod.DELETE)。 @PutMapping = @requestMapping(method = RequestMethod.PuT)。 ``` ## 一:@GetMapping請求 以`@GetMapping`為例,該組合註解是`@RequestMapping(method = RequestMethod.GET)`的縮寫,它會將HTTP GET請求對映到特定的處理方法上。 `RequestMapping`後所有屬性都是可選的,但其預設屬性是`value`。當`value`是其唯一屬性時,可以省略屬性名。 ```java @RequestMapping(value = "/rest",method = RequestMethod.GET) public String restGet(){ System.out.println("Get請求,hello....."); return "hello"; } ``` `@GetMapping`是一個組合註解,是`@RequestMapping(method = RequestMethod.GET)`的縮寫。 所以我們可以將以上程式碼簡單的寫成: ```java @GetMapping("/rest") public String restGet(){ System.out.println("Get請求,hello....."); return "hello"; } ``` ## 二:@PostMapping請求 ```java @PostMapping("/rest") public String restPost(){ System.out.println("Post請求,hello....."); return "hello"; } ``` ## 三:@DeleteMapping請求 ```java @DeleteMapping("/rest") public String restDelete(){ System.out.println("Delete請求,hello....."); return "redirect:rest"; } ``` ## 四:@PutMapping請求 ```java @PutMapping("/rest") public String restPut(){ System.out.println("Put請求,hello....."); return "redirect:rest"; } ``` # 叄:問題 ## 一:post請求轉換為delete與put請求 由於form表單只支援GET和POST請求,而不支援DELETE和PUT等請求方式,所以我們實現delete和put請求往往會報錯找不到方法。 Spring提供了一個過濾器`HiddenHttpMethodFilter`,可以將DELETE和PUT請求轉換為標準的HTTP方式,即能將POST請求轉為DELETE或PUT請求。 **具體實現**:在web.xml檔案中配置過濾器HiddenHttpMethodFilter ```xml ``` **注意**:delete和put請求最好使用Redirect(重定向),不然會報404錯誤。 ## 二:解決請求亂碼問題 ```xml ``` **注意**:編碼的過濾器應該放在所有的過濾器前,否則不生效 # 肆:RequestMapping註解的屬性 屬性名 | 型別 |描述 --|--|-- name|String|可選屬性,用於為對映地址指定別名。 value|String[]|可選屬性,同時也是預設屬性,用於對映一-個請求和一種方法,可以標註在一-個方法或一個類上。 method|RequestMethod[]|可選屬性,用於指定該方法用於處理哪種型別的請求方式,其請求方式包括GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE和TRACE例如method=RequestMethod.GET表示只支援GET請求,如果需要支援多個請求方式則需要通過{}寫成陣列的形式,並且多個請求方式之間是有英文逗號分隔。 params| String[]| 可選屬性,用於指定Request中必須包含某些引數的值,.才可以通過其標註的方法處理。 headers| String[]| 可選屬性,用於指定Request中必須包含某些指定的header的值,才可以通過其標註的方法處理。。 consumes| String[]| 可選屬性,用於指定處理請求的提交內容型別(Content-type),比如application/json,text/html等。 produces| String[]| 可選屬性,用於指定返回的內容型別,返回的內容型別必,須是request請求頭(Accept)中所包含的型別。 > 表中所有屬性都是可選的,但其預設屬性是value。當value是其唯一屬性時, 可以省略屬性名。 > 例如,下面兩種標註的含義相同: @RequestMapping(value="/rest") @RequestMapping("/rest") # 伍:測試 新建index.html檔案,加入以下程式碼。新建hello.html,用於請求後的頁面跳轉。 ```html

各種請求

hello Get請求 ``` 結果: ![](https://img-blog.csdnimg.cn/202003291243028