【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的 RESTful API 設計:從上手到骨折

?<前文回顧>

點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、開篇整活兒

咱今兒個嘮嘮 Spring Boot 里頭咋整 RESTful API。這玩意兒吧,說難不難,說簡單也不簡單,整好了是 API,整不好就是 AP(挨批)。你要是剛入門,那可得悠著點兒,別一上來就整得自己“骨折”了。

二、Spring MVC 和 RESTful API 是啥關系?

Spring MVC 是 Spring 里頭用來搞 Web 開發的框架,RESTful API 呢,就是一種設計風格,講究用 HTTP 協議里頭的 GET、POST、PUT、DELETE 這些方法來操作資源。Spring MVC 里頭有個叫?@Controller?的注解,專門用來處理 HTTP 請求,跟 RESTful API 那是天造地設的一對兒。

1. Controller 是咋回事?

Controller 就是 Spring MVC 里頭的一個組件,專門負責處理請求和返回響應。你可以把它想象成一個“接線員”,客戶端的請求來了,它得接電話,然后根據請求的內容,決定該干啥。

Java Code

@RestController

@RequestMapping("/api")

public class MyController {

????@GetMapping("/hello")

????public String sayHello() {

????????return "Hello, World!";

????}

}

這段代碼里頭,@RestController?是?@Controller?和?@ResponseBody?的結合體,意思就是這個類里頭的方法返回的都是直接寫給客戶端的數據,不用再整啥視圖解析了。@RequestMapping?是用來映射 URL 的,/api?就是根路徑,/hello?就是子路徑。

2. RESTful 風格的 URL 設計

RESTful 風格的 URL 講究的是“資源”和“操作”。比如說,你要操作一個用戶資源,那 URL 就得設計成?/users,然后根據不同的 HTTP 方法來做不同的操作:

  • GET?/users:獲取所有用戶
  • GET?/users/{id}:獲取某個用戶
  • POST?/users:創建一個用戶
  • PUT?/users/{id}:更新某個用戶
  • DELETE?/users/{id}:刪除某個用戶

Java Code

@RestController

@RequestMapping("/users")

public class UserController {

????@GetMapping

????public List<User> getUsers() {

????????// 返回所有用戶

????}

????@GetMapping("/{id}")

????public User getUser(@PathVariable Long id) {

????????// 返回某個用戶

????}

????@PostMapping

????public User createUser(@RequestBody User user) {

????????// 創建用戶

????}

????@PutMapping("/{id}")

????public User updateUser(@PathVariable Long id, @RequestBody User user) {

????????// 更新用戶

????}

????@DeleteMapping("/{id}")

????public void deleteUser(@PathVariable Long id) {

????????// 刪除用戶

????}

}

這段代碼里頭,@PathVariable?是用來從 URL 里頭提取參數的,@RequestBody?是用來接收客戶端傳過來的 JSON 數據的。

三、Filter 是咋過濾 RESTful 請求的?

Filter 是 Java Web 開發里頭的一個玩意兒,用來在請求到達 Controller 之前或者響應返回客戶端之前,做一些預處理或者后處理。比如說,你可以用 Filter 來過濾掉一些不合法的請求,或者給請求加上一些額外的信息。

1. 實現一個簡單的 Filter

Java Code

@Component

public class MyFilter implements Filter {

????@Override

????public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

????????????throws IOException, ServletException {

????????HttpServletRequest httpRequest = (HttpServletRequest) request;

????????String method = httpRequest.getMethod();

????????if ("GET".equals(method)) {

????????????// 處理 GET 請求

????????} else if ("POST".equals(method)) {

????????????// 處理 POST 請求

????????}

????????chain.doFilter(request, response);

????}

}

這段代碼里頭,doFilter?方法是 Filter 的核心方法,所有的請求都會經過這個方法。chain.doFilter?是讓請求繼續往下走,如果不調用這個方法,那請求就被攔截了。

2. Filter 的應用場景

Filter 可以用來干很多事兒,比如說:

  • 權限校驗:看看用戶有沒有權限訪問某個資源
  • 日志記錄:記錄每個請求的詳細信息
  • 請求參數處理:對請求參數做一些預處理,比如說去掉空格啥的

Java Code

@Component

public class AuthFilter implements Filter {

????@Override

????public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

????????????throws IOException, ServletException {

????????HttpServletRequest httpRequest = (HttpServletRequest) request;

????????String token = httpRequest.getHeader("Authorization");

????????if (token == null || !isValidToken(token)) {

????????????HttpServletResponse httpResponse = (HttpServletResponse) response;

????????????httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

????????????return;

????????}

????????chain.doFilter(request, response);

????}

????private boolean isValidToken(String token) {

????????// 校驗 token 是否有效

????????return true;

????}

}

這段代碼里頭,AuthFilter?是用來做權限校驗的,如果請求里頭沒有帶?Authorization?頭,或者 token 無效,那就返回 401 狀態碼,表示未授權。

四、Spring Boot 里頭的 RESTful API 設計小技巧

1. 使用?@ExceptionHandler?處理異常

RESTful API 里頭,異常處理是個大事兒。Spring Boot 里頭有個?@ExceptionHandler?注解,專門用來處理 Controller 里頭的異常。

Java Code

@RestControllerAdvice

public class GlobalExceptionHandler {

????@ExceptionHandler(Exception.class)

????public ResponseEntity<String> handleException(Exception e) {

????????return new ResponseEntity<>("出錯了:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);

????}

}

這段代碼里頭,@RestControllerAdvice?是用來定義一個全局的異常處理類,@ExceptionHandler?是用來處理特定類型的異常的。ResponseEntity?是用來返回 HTTP 響應的,里頭可以帶上狀態碼和響應體。

2. 使用?@Valid?做參數校驗

RESTful API 里頭,參數校驗也是個大事兒。Spring Boot 里頭有個?@Valid?注解,專門用來做參數校驗。

Java Code

@PostMapping("/users")

public User createUser(@Valid @RequestBody User user) {

????// 創建用戶

}

這段代碼里頭,@Valid?是用來校驗?User?對象的,如果?User?對象里頭的字段不符合要求,那就會拋出?MethodArgumentNotValidException?異常。

3. 使用?@ConfigurationProperties?做配置綁定

Spring Boot 里頭有個?@ConfigurationProperties?注解,專門用來把配置文件里頭的屬性綁定到 Java 對象里頭。

Java Code

@ConfigurationProperties(prefix = "myapp")

public class MyAppProperties {

????private String name;

????private String version;

????// getters and setters

}

這段代碼里頭,@ConfigurationProperties?是用來把?application.properties?里頭以?myapp?開頭的屬性綁定到?MyAppProperties?對象里頭的。

五、Spring Boot 里頭的 RESTful API 設計坑點

1. 路徑沖突

Spring Boot 里頭,路徑設計得不好,就容易出現沖突。比如說,你有兩個方法,一個映射到?/users/{id},另一個映射到?/users/new,那 Spring Boot 就不知道該調用哪個方法了。

Java Code

@GetMapping("/users/{id}")

public User getUser(@PathVariable Long id) {

????// 返回某個用戶

}

@GetMapping("/users/new")

public User newUser() {

????// 返回一個新用戶

}

這段代碼里頭,/users/{id}?和?/users/new?就沖突了,因為?new?會被當成?id?來處理。

2. 跨域問題

RESTful API 里頭,跨域是個常見問題。Spring Boot 里頭可以用?@CrossOrigin?注解來解決跨域問題。

Java Code

@CrossOrigin(origins = "http://example.com")

@RestController

@RequestMapping("/api")

public class MyController {

????// ...

}

這段代碼里頭,@CrossOrigin?是用來允許?http://example.com?這個域名跨域訪問的。

專有名詞解釋

  1. Spring MVC:Spring 框架中的一個模塊,用于構建 Web 應用程序,基于 Model-View-Controller 設計模式。
  2. RESTful API:一種基于 HTTP 協議的 API 設計風格,強調資源的操作和狀態轉移。
  3. Controller:Spring MVC 中的一個組件,負責處理 HTTP 請求并返回響應。
  4. Filter:Java Web 開發中的一個組件,用于在請求到達 Controller 之前或響應返回客戶端之前進行預處理或后處理。
  5. RestController:Spring MVC 中的一個注解,結合了?Controller?和?ResponseBody,用于返回直接寫給客戶端的數據。
  6. RequestMapping:Spring MVC 中的一個注解,用于映射 URL 路徑到 Controller 方法。
  7. PathVariable:Spring MVC 中的一個注解,用于從 URL 路徑中提取參數。
  8. RequestBody:Spring MVC 中的一個注解,用于接收客戶端傳過來的 JSON 數據。
  9. ExceptionHandler:Spring MVC 中的一個注解,用于處理 Controller 中的異常。
  10. Valid:Spring MVC 中的一個注解,用于做參數校驗。
  11. ConfigurationProperties:Spring Boot 中的一個注解,用于將配置文件中的屬性綁定到 Java 對象中。
  12. CrossOrigin:Spring Boot 中的一個注解,用于解決跨域問題。
  13. Async:Spring Boot 中的一個注解,用于讓方法異步執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898754.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分享最近前端面試遇到的一些問題

前情提要&#xff08;分享個人情況&#xff0c;可以直接跳過&#xff09; 先說一下我的個人情況&#xff0c;我是2026屆的&#xff0c;目前是在找前端實習。 3月初&#xff0c;從3月3日開始在Boss上投簡歷。 分享我的個人故事&#xff0c;不想看可以直接滑到下面&#xff0c;…

rip 協議詳細介紹

以下是關于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息協議&#xff09; 的詳細介紹&#xff0c;涵蓋其工作原理、版本演進、配置方法、優缺點及實際應用場景。 1. RIP 協議概述 類型&#xff1a;動態路由協議&#xff0c;基于距離矢量算法&#xff08…

scrapy入門(深入)

Scrapy框架簡介 Scrapy是:由Python語言開發的一個快速、高層次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站點并從頁面中提取結構化的數據&#xff0c;只需要實現少量的代碼&#xff0c;就能夠快速的抓取。 新建項目 (scrapy startproject xxx)&#xff1a;新建一個新的…

KiLog2MaximumIncrement的由來和KiMaximumIncrementReciprocal的由來

第一部分&#xff1a;KiLog2MaximumIncrement的由來 i 1; j KeMaximumIncrement; while ((1UI64<<i) < KeMaximumIncrement) { i; } KiLog2MaximumIncrement i; 2^17131072 2^18262144 i18KiLog2MaximumIncrement 中…

數據結構-ArrayList

文章目錄 1. 線性表2. 順序表3. ArrayList4. ArrayList的問題以及思考4.2 增容的性能消耗問題4.3 空間浪費問題 1. 線性表 線性表&#xff08;Linear List&#xff09;是n個具有相同特性的數據元素的有限序列。線性表是一種在實際中廣泛使用的數據結構&#xff0c;常見線性表&…

FastGPT 社區版快速部署指南

產品簡介 FastGPT 是基于大語言模型的智能知識庫系統&#xff0c;提供以下核心能力&#xff1a; ? 開箱即用 - 內置數據預處理、多模型對接、權限管理 ? 可視化編排 - 通過 Flow 工作流實現復雜問答邏輯設計 ? 多場景適配 - 支持客服機器人/知識檢索/數據分析等場景 &…

【css酷炫效果】純CSS實現科技感網格背景

【css酷炫效果】純CSS實現科技感網格背景 緣創作背景html結構css樣式完整代碼基礎版進階版(3D光線掃描版) 效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;上傳后更新 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&#xff0c;趕時間&a…

Android BLE 權限管理

前言 android 權限一直是比較活躍的 在藍牙權限這一塊又分新版和舊版 新版權限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT舊版權限如9.0以下 Manifest.permission.A…

vue3:十一、主頁面布局(左側菜單折疊展開設置)

一、實現效果 二、基本實現 1、菜單容器增加展開收縮方法 在菜單容器中開啟這個方法&#xff0c;值設置為一個變量 :collapseiscollapse 2、定義菜單收縮與否的變量 在js中初始化是否收縮的變量&#xff0c;初始值為不收縮(也就是展開) //左側菜單展開與收縮 const iscolla…

Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics

show zone member: Shows the name of the zone to which a device belongs to. This command can be used to find the victims of a culprit device or vice versa. 顯示設備所屬的區域名稱。該命令可用于查找罪魁禍首設備的受害者,反之亦然。 show zone active: Shows the…

使用 JDBC 插入數據并獲取自動生成的主鍵(如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列) 的完整示例代碼,包含詳細注釋

以下是使用 JDBC 插入數據并獲取自動生成的主鍵&#xff08;如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列&#xff09; 的完整示例代碼&#xff0c;包含詳細注釋&#xff1a; import java.sql.*;public class GeneratedKeysExample {// 數據庫連接參數private static final St…

網絡爬蟲【爬蟲庫request】

我叫不三不四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步 今天來講一講爬蟲 Requests是Python的一個很實用的HTTP客戶端庫&#xff0c;完全滿足如今網絡爬蟲的需求。與Urllib對比&#xff0c;Requests不僅具備Urllib的全部功能&#xff1b;在開發使用上&…

MTKAndroid12 解決SystemUI下拉框中,長按WIFI圖標會導致崩潰問題

解決SystemUI下拉框中&#xff0c;長按WIFI圖標會導致崩潰問題 文章目錄 場景參考資料修改文件解決方案日志源碼分析 總結 場景 在部分產品中偶發性發現&#xff0c; SystemUI下拉框下拉后長按WIFI圖標會導致崩潰問題&#xff0c;有時候是截屏、點擊Home 按鍵后&#xff0c;長…

第三十一篇 數據倉庫(DW)與商業智能(BI)架構設計與實踐指南

目錄 一、DW/BI架構核心理論與選型策略1.1 主流架構模式對比&#xff08;1&#xff09;Kimball維度建模架構&#xff08;2&#xff09;Inmon企業工廠架構&#xff08;3&#xff09;混合架構 二、架構設計方法論與實施步驟2.1 維度建模實戰指南&#xff08;1&#xff09;模型選擇…

XSS基礎靶場練習

目錄 1. 準備靶場 2. PASS 1. Level 1&#xff1a;無過濾 源碼&#xff1a; 2. level2&#xff1a;轉HTML實體 htmlspecialchars簡介&#xff1a; 源碼 PASS 3. level3:轉HTML深入 源碼&#xff1a; PASS 4. level4:過濾<> 源碼&#xff1a; PASS: 5. level5:過濾on 源碼…

2025年3月AI搜索發展動態與趨勢分析:從技術革新到生態重構

025年3月AI搜索發展動態與趨勢分析&#xff1a;從技術革新到生態重構 一、行業動態&#xff1a;巨頭布局與技術升級 谷歌推出“AI模式”&#xff0c;重新定義搜索體驗 谷歌上線全新“AI模式”&#xff0c;集成多模態交互與實時數據能力&#xff0c;用戶可通過文本、圖片或語音…

熔斷降級(Sentinel解決)

問題概述 在微服務架構中一定要預防微服務雪崩問題&#xff0c;微服務雪崩問題就是指在微服務架構中&#xff0c;當一個服務出現故障時&#xff0c;由于服務之間的依賴關系&#xff0c;故障可能會傳播到其他服務&#xff0c;從而導致了大規模的服務失敗&#xff0c;系統無法正…

Qt高分屏自適應

一.設置默認 DPI 感知 Windows 上的桌面應用程序可以在不同的 DPI 感知模式下運行。 這些模式可實現不同的 DPI 縮放行為,并且可以使用不同的坐標空間。 有關 DPI 感知的詳細信息,請參閱在 Windows 上開發高 DPI 桌面應用程序。 請務必顯式為進程設置默認 DPI 感知模式,以避…

TPCTF 2025 web 復現

文章目錄 baby layoutsafe layoutSafe Layout Revengesupersqli baby layout 在index.js文件中&#xff0c;看到了有使用DOMPurify庫來防止XSS操作 在package.json里可以看到版本是3.2.4,關于3.2.3是有繞過策略的。它會把script標簽清除掉&#xff0c;去看bot可以看到flag是放…

Agent Team 多智能體系統解析

引言 在人工智能技術高速發展的今天&#xff0c;"多智能體協作系統"&#xff08;Agent Team&#xff09;正成為突破效率瓶頸的關鍵技術。與傳統的單體AI不同&#xff0c;這種由多個專業化智能體組成的協同網絡&#xff0c;通過分工協作和動態調整&#xff0c;展現出…