Spring Boot中請求參數讀取方式

目錄

一、前言

二、六種參數讀取方式

1.@RequestParam

2.@PathVariable

3.@RequestBody

4.@RequestHeader

5.@CookieValue

6.@MatrixVariable

三、對比和搭配

1.適用方法類型及建議使用場景

2.建議使用的請求路徑注解

3.?多種參數同時使用

4.同一請求不同方案?

四、結語

一、前言

在 Spring Boot 開發中,接口設計與請求參數的讀取方式是每個開發者必須掌握的核心知識點。本文基于一個真實的用戶管理模塊(UserController)展開討論,深入剖析了常見的六種請求參數綁定注解(如 @RequestParam、@RequestBody 等)的使用場景、適用 HTTP 方法類型以及它們在實際開發中的最佳實踐。
通過問答的形式,我們不僅梳理了不同注解的使用差異,還探討了 RESTful 風格的設計理念、接口方法選擇的原則,以及為何在某些場景下更推薦使用 @GetMapping 而非 @PostMapping。文章內容貼近實戰,適合初學者快速入門,也適合有一定經驗的開發者進行知識體系的查漏補缺。

二、六種參數讀取方式

1.@RequestParam

1.定義:從 URL 查詢參數中獲取值

2.后端示例:

    //單個參數@GetMapping("/getUserById")public UserEntity getUserById(@RequestParam("id") Integer id) {return userService.getUserById(id);}//多個參數@GetMapping("/getUserById")public UserEntity getUserById(@RequestParam("id") Integer id, @RequestParam("name") String name) {return userService.getUserById(id);}

3.前端?Axios 調用:

//單個參數
axios.get('/getUserById', { params: { id: 123 } }).then(res => console.log(res.data));
//多個參數
axios.get('/getUserById', { params: { id: 123, name: '王' } }).then(res => console.log(res.data));

?4.Postman調用:

多個參數用&隔開,如下:

2.@PathVariable

1.定義:從路徑中提取變量

2.后端示例:

//單個參數
@GetMapping("/user/{id}")
public String getUserById(@PathVariable Integer id) {return "User ID: " + id;
}
//多個參數
@GetMapping("/user/{id}/{name}")
public String getUserById(@PathVariable Integer id, @PathVariable String name) {return "User ID: " + id;
}

3.前端?Axios 調用:

//單個參數
axios.get('/user/456').then(res => console.log(res.data));
//多個參數
axios.get('/user/456/王').then(res => console.log(res.data));

4.Postman調用

多個參數用/路徑隔開。

3.@RequestBody

1.定義:從請求體中讀取 JSON 數據

2.后端示例:

 @PostMapping("/addUser")public Integer addUser(@RequestBody UserEntity userEntity) {return userService.addUser(userEntity);}

3.前端Axios調用:

axios.post('/user/addUser', {name: '張三',email: 'zhangsan@example.com'
})
.then(res => console.log(res.data));

?4.Postman調用:

4.@RequestHeader

1.定義:從 HTTP 請求頭中獲取值

2.后端示例:

@GetMapping("/auth")
public String checkAuth(@RequestHeader("Authorization") String token) {return "Token: " + token;
}

3.前端Axios調用:

axios.get('/auth', {headers: { Authorization: 'Bearer token' }
})
.then(res => console.log(res.data));

4.Postman調用:

5.@CookieValue

1.定義:從 Cookie 中獲取值

2.后端示例:

@GetMapping("/profile")
public String getProfile(@CookieValue("JSESSIONID") String sessionId) {return "Session ID: " + sessionId;
}

3.前端Axios調用(瀏覽器自動攜帶 Cookie):

axios.get('/profile').then(res => console.log(res.data));

(注:前端無法直接設置 Cookie 來模擬發送,需由后端設置或在瀏覽器環境中已有該 Cookie。?)

6.@MatrixVariable

1.定義:從 URI 中提取矩陣參數(不常用)

2.后端示例:

//單個參數
@GetMapping("/users")
public String getUsersByMatrix(@MatrixVariable("type") String type) {return "Type: " + type;
}
//多個參數
@GetMapping("/users")
public String getUsersByMatrix(@MatrixVariable("type") String type,@MatrixVariable("name") String name
) {return "Type: " + type;
}

3.前端Axios調用:

多個參數用;隔開

//單個參數
axios.get('/users/2024;type=admin').then(res => console.log(res.data));
//多個參數
axios.get('/users/2024;type=admin;name=王').then(res => console.log(res.data));

4.Postman調用:

多個參數用;隔開

三、對比和搭配

1.適用方法類型及建議使用場景

2.建議使用的請求路徑注解

3.?多種參數同時使用

1.Spring MVC 支持在一個接口中混合使用多個參數注解。只要請求中提供了這些參數,就可以全部綁定到方法參數上,如下:

@GetMapping("/user/{id}")
public String getUserInfo(@PathVariable("id") Integer id,@RequestParam("name") String name,@RequestHeader("Authorization") String token,@CookieValue("JSESSIONID") String sessionId,@MatrixVariable("type") String type) {return String.format("ID: %d, Name: %s, Token: %s, Session ID: %s, Type: %s",id, name, token, sessionId, type);
}

2.?@RequestBody 不能與 @RequestParam、@PathVariable 等一起出現在同一個方法中(因為 @RequestBody 只能處理整個請求體)。
3.若使用了 @RequestBody,其他參數只能從 Header、Cookie、Path Variable 等非 Body 的地方獲取。

4.同一請求不同方案?

看了上面的注解搭配,有同學就要問了,我可以把@GetMapping+@RequestParam組合改成@PostMapping + @RequestBody啊,因為我post請求用著比較熟練,就像下面這樣:

@GetMapping("/getUserById")
public UserEntity getUserById(@RequestParam("id") Integer id)||V
public class UserIdDTO {private Integer id;// getter/setter
}@PostMapping("/getUserById")
public UserEntity getUserById(@RequestBody UserIdDTO dto) {return userService.getUserById(dto.getId());
}

答:這種方式是可以的,雖然在技術上可以都用@PostMapping+@RequestBody,在實際開發中我們遵循一些約定俗成的設計原則和 RESTful 風格,比如:

  • 語義清晰:GET 表示獲取資源,POST 表示創建資源。符合 RESTful 設計規范。
  • 冪等性&安全性:GET 請求是冪等且安全的(不會改變服務器狀態),更適合查詢操作。
  • 緩存友好:GET 請求可以被緩存,而 POST 不會。
  • 書簽/歷史記錄支持:GET 請求能保存在瀏覽器歷史或書簽中,方便調試或直接訪問。
  • 簡單易測試:使用 URL 參數更容易通過瀏覽器或 Postman 直接測試。

注:以下是RESTful風格最佳實踐。

?

四、結語

通過對 UserController 示例代碼的深入分析,我們可以看到 Spring MVC 在接口設計上的靈活性與規范性并存。理解每種參數綁定方式的適用場景和限制,有助于我們在日常開發中寫出更加清晰、安全、可維護的接口。
同時,Spring 提供的 @RequestMapping 及其派生注解,為我們構建結構良好的 Web API 提供了強有力的支撐。合理地使用這些注解,不僅能提升開發效率,還能增強接口的可讀性和一致性。
希望本文能幫助你在 Spring Boot 接口設計與參數處理方面有所收獲。如果你在開發過程中也有類似疑問,歡迎留言交流,共同進步?

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

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

相關文章

2025華為OD機試真題最新題庫 (B+C+D+E+2025A+2025B卷) + 在線OJ在線刷題使用(C++、Java、Python C語言 JS合集)(正在更新2025B卷,目前已收錄710道)

2025年,已經開始使用AB卷題庫,題目和往期一樣,舊題加新題的組合,有題目第一時間更新,大家可以跟著繼續學習,目前使用復用題較多,可在OJ上直接找到對應的AB卷學習,可以放心學習&#…

分析新舊因子相關性

計算一組新因子、并分析它們與已有因子間的相關性1. 導入庫和初始化環境功能代碼解析數據加載2. 定義新因子計算函數功能代碼解析因子 1:波動率過濾器(filter_001_1)因子 2:ATR 過濾器(filter_001_2)因子 3…

Unity Demo——3D平臺跳躍游戲筆記

今天是一個3D平臺跳躍游戲的筆記。我們按照以下分類來對這個項目的代碼進行學習:核心游戲系統 (Core Game Systems)核心游戲系統是IkunOdyssey項目的基礎,負責所有游戲對象(如玩家、敵人、道具等)的通用行為和物理交互。它通過實體…

【C語言】回調函數、轉移表、qsort 使用與基于qsort改造冒泡排序

文章目錄數組指針/指針數組函數指針函數指針數組函數指針數組用途(轉移表)回調函數qsort函數基于qsort改造冒泡排序源碼數組指針/指針數組 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是數組指針變量int* arr2[5] { 0 }; //arr2是指針數組指針數組是存放指…

vue3 uniapp 使用ref更新值后子組件沒有更新 ref reactive的區別?使用from from -item執行表單驗證一直提示沒有值

遇到這樣一個問題,我有個1個頁面A,一個from表單組件,一個form-item組件, 使用是這樣的,我在父組件A中使用 ,執行表單驗證一直提示沒有值咱們先來講一講ref 和reactive的區別 ref 用來創建一個基本類型或單…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout(框布局) 采用QBoxLayout類可以在水平和垂直方向上排列控件,QHBoxLayout和 QVBoxLayout類繼承自QBoxLayout類。 QHBoxLayout(水平布局) 采用QHBoxLayout類,按照從左到右的順序來添加控件。QHBoxL…

Grok 4作戰圖刷爆全網,80%華人橫掃硅谷!清華上交校友領銜,95后站C位

來源 | 新智元短短兩年,馬斯克Grok 4的橫空出世,讓xAI團隊一舉站上AI之巔。昨日一小時發布會,Grok 4讓所有人大開眼界,直接刷爆了AIME 2025、人類最后的考試(HLE)兩大基準。這是狂堆20萬GPU才換來的驚人成果…

AI大模型(七)Langchain核心模塊與實戰(二)

Langchain核心模塊與實戰(二)Langchian向量數據庫檢索Langchian構建向量數據庫和檢索器批量搜索返回與之相似度最高的第一個檢索器和模型結合得到非籠統的答案LangChain構建代理通過代理去調用Langchain構建RAG的對話應用包含歷史記錄的對話生成Langchia…

Flutter基礎(前端教程①-容器和控件位置)

一個紅色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按鈕下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目錄 flex-box和flex-item 主軸和副軸 ?編輯 flex-box的屬性 flex-direction flex-wrap flex-flow justify-content ?編輯?align-items align-content flex-item的屬性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 當把一個塊級元素的displ…

【JMeter】執行系統命令

步驟如下: 添加JSP233 Sampler:右擊線程組>添加>取樣器>JSR223 Sampler2.填寫腳本,執行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent開發學習系列 - langchain之memory(1):內存中的短時記憶

內存中的短時記憶,在 LangChain 中通常指 ConversationBufferMemory 這類“對話緩沖記憶”工具。它的作用是:在內存中保存最近的對話歷史,讓大模型能理解上下文,實現連續對話。 對話緩沖記憶”工具 主要特點 只保留最近的對話內容…

uniapp實現微信小程序端圖片保存到相冊

效果圖展示 安裝插件海報畫板導入到項目里面&#xff0c;在頁面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相冊</button><image :src"path" mode"widthFix" v-if&qu…

Java生產帶文字、帶邊框的二維碼

Java 生成帶文字、帶邊框的二維碼1、Java 生成帶文字的二維碼1.1、導入jar包1.2、普通單一的二維碼1.2.1、代碼示例1.2.2、效果1.3、帶文字的二維碼1.&#xff13;.&#xff11;、代碼示例1.3.2、效果2、帶邊框的二維碼2.1、代碼示例2.2、帶邊框的二維碼效果 1、Java 生成帶文字…

ARM單片機啟動流程(三)(棧空間綜合理解及相關實際應用)

文章目錄1、引出棧空間問題2、解決問題2.1、RAM空間2.2、RAM空間具體分布2.3、關于棧空間的使用2.4、棧溢出2.5、變量的消亡2.6、回到關鍵字static2.7、合法性的判斷1、引出棧空間問題 從static關鍵字引出該部分內容。 為什么能從static引出來&#xff1f; 在使用該關鍵字的…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 鍵控LED實驗

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1.實驗簡介 實驗目的&#xff1a; 從創建工程到編寫代碼&#xff0c;完成引腳約束&#xff0c;最后生成 bit 流下載到…

【Python練習】039. 編寫一個函數,反轉一個單鏈表

039. 編寫一個函數,反轉一個單鏈表 039. 編寫一個函數,反轉一個單鏈表方法 1:迭代實現運行結果代碼解釋方法 2:遞歸實現運行結果代碼解釋選擇方法迭代法與遞歸法的區別039. 編寫一個函數,反轉一個單鏈表 在 Python 中,可以通過迭代或遞歸的方式反轉一個單鏈表。 方法 1…

BERT代碼簡單筆記

參考視頻&#xff1a;BERT代碼(源碼)從零解讀【Pytorch-手把手教你從零實現一個BERT源碼模型】_嗶哩嗶哩_bilibili 一、BertTokenizer BertTokenizer 是基于 WordPiece 算法的 BERT 分詞器&#xff0c;繼承自 PreTrainedTokenizer。 繼承的PretrainedTokenizer&#xff0c;具…

PID控制算法理論學習基礎——單級PID控制

這是一篇我在學習PID控制算法的過程中的學習記錄。在一開始學習PID的時候&#xff0c;我也看了市面上許多的資料&#xff0c;好的資料固然有&#xff0c;但是更多的是不知所云。&#xff08;有的是寫的太過深奧&#xff0c;有的則是照搬挪用&#xff0c;對原理則一問三不知&…

【Elasticsearch】function_score與rescore

它們倆都是用來“**干涉評分**”的&#xff0c;但**工作階段不同、性能開銷不同、能做的事也不同**。一句話總結&#xff1a;> **function_score** 在 **第一次算分** 時就動手腳&#xff1b; > **rescore** 在 **拿到 Top-N 結果后** 再“重新打分”。下面把“能干嘛”…