😀前言
本篇博文是關于Rest 風格請求的應用和注意事項,希望能夠幫助到您😊
🏠個人主頁:晨犀主頁
🧑個人簡介:大家好,我是晨犀,希望我的文章可以幫助到大家,您的滿意是我的動力😉😉
💕歡迎大家:這里是CSDN,我總結知識的地方,歡迎來到我的博客,感謝大家的觀看🥰
如果文章有什么需要改進的地方還請大佬不吝賜教 先在此感謝啦😊
文章目錄
- Rest 風格請求處理
- 基本介紹
- SpringBoot Rest 風格應用實例
- 應用實例
- Rest 風格請求-注意事項和細節
- 注意
- 小細節:思考
- 解讀:
- 😄總結
Rest 風格請求處理
基本介紹
REST:即Representational State Transfer。(資源)表現層狀態轉化。是目前流行的請求方式。它結構清晰, 很多網站采用
- Rest 風格支持(使用HTTP 請求方式動詞來表示對資源的操作)
- 舉例說明:
● 請求方式: /monster
● GET-獲取怪物
● DELETE-刪除怪物
● PUT-修改怪物
● POST-保存妖怪
SpringBoot Rest 風格應用實例
需求: 演示SpringBoot 中如何實現Rest 風格的增刪改查
應用實例
1.創建com/nlc/web/controller/MonsterController.java
@RestController
//@Controller
public class MonsterController {//等價的寫法//@RequestMapping(value = "/monster",method = RequestMethod.GET)@GetMapping("/monster")public String getMonster() {return "GET-查詢妖怪";}//等價寫法//@RequestMapping(value = "/monster", method = RequestMethod.POST)@PostMapping("/monster")public String saveMonster() {return "POST-添加妖怪";}//等價寫法//@RequestMapping(value = "/monster",method = RequestMethod.PUT)@PutMapping("/monster")public String putMonster() {return "PUT-修改妖怪~~";}//等價寫法//@RequestMapping(value = "/monster", method = RequestMethod.DELETE)@DeleteMapping("/monster")public String delMonster() {return "DELETE-刪除妖怪";}}
- 使用Postman 完成測試, 請求url: http://localhost:8080/monster
Rest 風格請求-注意事項和細節
1、客戶端是PostMan 可以直接發送Put、delete 等方式請求,可不設置Filter
2、如果要SpringBoot 支持頁面表單的Rest 功能, 則需要注意如下細節
注意
- Rest 風格請求核心Filter :HiddenHttpMethodFilter:瀏覽器form 表單只支持GET 與POST 請求,而DELETE、PUT等method 并不支持,Spring 添加了一個過濾器,可以將這些請求轉換為標準的http 方法,使得支持GET、POST、PUT 與DELETE 請求。
- 、HiddenHttpMethodFilter 在將post 轉成delete / put 請求時,是按_method 參數名來讀取的。
- 表單請求會被HiddenHttpMethodFilter 攔截, 獲取到表單_method 的值, 再判斷是PUT/DELETE/PATCH(注釋: PATCH 方法是新引入的,是對PUT 方法的補充,用來對已知資源進行局部更新:https://segmentfault.com/q/1010000005685904)。
- 如果要SpringBoot 支持頁面表單的Rest 功能, 需要在application.yml 啟用filter 功能,否則無效。
- 修改application.yml 啟用filter 功能。
spring:mvc:static-path-pattern: /res/** #修改靜態資源訪問的路徑/前綴hiddenmethod:filter:enabled: true #啟用了HiddenHttpMethodFilter,開啟頁面表單的Rest功能web:resources:#修改/指定 靜態資源的訪問路徑/位置static-locations: ["classpath:/img/","classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/"]#String[] staticLocations
- 修改對應的頁面, 自己測試即可.
- 創建src\main\resources\public\rest.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>rest</title>
</head>
<body>
<h1>測試rest風格的url, 來完成請求.</h1>
<form action="/monster" method="post">u: <input type="text" name="name"><br/><!-- 通過隱藏域傳遞_method 參數指定值--><!--如果要測試delete, put , 就打開下面的注釋--><!-- <input type="hidden" name="_method" value="delete">--><input type="submit" value="點擊提交">
</form>
</body>
</html>
- 完成測試, 注意url 是localhost:8080/res/rest.html, 如果希望url 是localhost:8080/rest.html, 將application.yml 文件的static-path-pattern: /res/** 注銷即可
小細節:思考
為什么這里return “GET-查詢妖怪”, 返回的是字符串, 而不是轉發到對應的資源文件?
解讀:
因為@ResController 是一個復合注解, 含有@ResponseBody, 所以springboot 底層(springmvc), 在處理return “xxx” 時, 會以@ResponseBody 注解進行解析處理, 即返回字符串"xxx", 而不會使用視圖解析器來處理。
我們可以試一下, 如果我們把@RestController 改成@Controller , 當你訪問getMonster() 時, 如果你有xxx.html就會轉發到xxx.html , 如果沒有xxx.html , 就會報404。
提示: 在測試時, 將xxx.html 放在main\resources\public\xxx.html 進行測試, 并在application.yml 配置視圖解析器
@GetMapping("/monster")
public String getMonster() {return "GET-查詢妖怪";
}
—在application.yml 配置解析器-----
spring:mvc:view:suffix: .html #后綴prefix: / #前綴
—提示: 測試完后, 把代碼恢復原狀-----
使用Postman 進行測試, 可能出現的問題和解決方案分析.
如何解決
spring:mvc:
# static-path-pattern: /res/** #修改靜態資源訪問的路徑/前綴hiddenmethod:filter:enabled: true #啟用了HiddenHttpMethodFilter,開啟頁面表單的Rest功能view: #配置視圖解析器suffix: .htmlprefix: / #這里是需要注意 prefix需要和當前的static-path-pattern一致。如果不一致就無法訪問到靜態資源
😄總結
- 不含有@ResponseBody時, springboot 底層(springmvc) 在處理return “xxx” 時是有順序的。
- 如果配置了視圖解析器,就按照視圖解析器來定位;如果沒有配置視圖解析器,就看controller有沒有/xxx
- HiddenHttpMethodFilter 在將post 轉成delete / put 請求時,是按_method 參數名來讀取的。
😁熱門專欄推薦
SpringBoot篇
SpringBoot容器–注解的使用
以數據為中心的標記語言–yaml
SpringBoot 自動配置–常用配置
Spring Boot介紹–快速入門–約定優于配置
安裝Lombok–Lombok的常用注解說明及使用方法
SpringBoot 依賴管理和自動配置—帶你了解什么是版本仲裁
文章到這里就結束了,如果有什么疑問的地方請指出,諸大佬們一起來評論區一起討論😁
希望能和諸大佬們一起努力,今后我們一起觀看感謝您的閱讀🍻
如果幫助到您不妨3連支持一下,創造不易您們的支持是我的動力🤞