SpringBoot接收前端參數(shù)的最常用的場景和具體案例
小伙伴會不會有疑問:“前端怎么給后端傳數(shù)據(jù)呀?比如我想根據(jù)用戶 ID 查對應的用戶信息,該怎么寫?” 今天這篇就聚焦 “接收前端參數(shù)” 這個核心需求,用 3 個最常用的場景 + 具體案例,手把手教你搞定,看完就能直接用在項目里!
一、先搞懂:前端會怎么傳參數(shù)
在寫代碼前,我們先花 2 分鐘搞清楚前端給后端傳參數(shù)的 3 種常見方式,因為不同的傳參方式,后端接收的寫法不一樣:
1. 路徑傳參(比如http://localhost:8080/user/1)
參數(shù)直接拼在 URL 路徑里,像上面的 “1” 就是用戶 ID,這種方式適合傳單個、簡單的參數(shù)(比如 ID、編號),URL 看起來很簡潔。
2. 問號傳參(比如http://localhost:8080/product?name=手機&price=3000)
參數(shù)用 “?” 開頭,多個參數(shù)用 “&” 分隔,這種方式適合傳多個可選參數(shù)(比如商品搜索時的名稱、價格范圍)。
3. 請求體傳參(JSON 格式)
參數(shù)放在請求的 “body” 里,不是拼在 URL 上,格式是 JSON,這種方式適合傳復雜、多字段的參數(shù)(比如用戶注冊時的姓名、手機號、密碼,或者提交訂單時的多個商品信息),安全性更高,參數(shù)也更靈活。
這 3 種方式覆蓋了 90% 以上的開發(fā)場景,接下來我們逐個講解后端怎么接收~
二、準備工作:復用之前的項目和實體類
我們還是在之前的「first-springboot-project」項目里操作,不用新建項目,直接復用已經(jīng)創(chuàng)建好的:
- 實體類:
User(用戶 ID、姓名、年齡、手機號)、Product(商品 ID、名稱、價格、庫存); - 控制器:可以在之前的
JsonController里加方法,也可以新建ParamController(推薦新建,分類更清晰),這里我們選擇新建。
先確認項目能正常運行,沒有報錯~
三、場景 1:路徑傳參(接收單個參數(shù),如用戶 ID)
最常見的需求:前端傳用戶 ID(比如 “1”),后端根據(jù) ID 查詢對應的用戶信息并返回。
1. 寫接口:用@PathVariable接收路徑參數(shù)
新建ParamController,在里面寫一個根據(jù)用戶 ID 查用戶的接口:
package com.example.firstspringbootproject.controller;
import com.example.firstspringbootproject.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ParamController {
/*
接口1:路徑傳參——根據(jù)用戶ID查詢用戶
訪問路徑:/user/{userId},其中{userId}是占位符,表示這里要傳用戶ID
@PathVariable("userId"):把路徑里{userId}的值,賦值給方法參數(shù)Integer userId
*/
@GetMapping("/user/{userId}")
public User getUserById(@PathVariable("userId") Integer userId) {
// 注意:這里只是模擬查詢(實際項目會從數(shù)據(jù)庫查),根據(jù)傳的userId返回不同用戶
if (userId == 1) {
// 返回ID為1的用戶
return new User(1, "小明", 20, "13800138000");
} else if (userId == 2) {
// 返回ID為2的用戶
return new User(2, "小紅", 19, "13900139000");
} else {
// 沒有匹配的用戶,返回null(實際項目會返回“用戶不存在”的提示)
return null;
}
}
}
2. 關鍵說明(重點看這 2 處)
- 路徑占位符:
@GetMapping("/user/{userId}")里的{userId}是 “占位符”,表示這個位置要傳參數(shù),參數(shù)名可以自己定(比如{id}也可以); - @PathVariable 注解:
@PathVariable("userId")用來 “提取” 路徑里占位符的值,括號里的 “userId” 要和路徑里{userId}的名稱完全一致,然后賦值給后面的Integer userId參數(shù)。
3. 測試接口(用瀏覽器或 Apifox)
測試 1:查詢 ID 為 1 的用戶
- 瀏覽器地址欄輸入:
http://localhost:8080/user/1; - 返回結果(JSON):
{"id":1,"name":"小明","age":20,"phone":"13800138000"},正確!
測試 2:查詢 ID 為 2 的用戶
- 輸入:
http://localhost:8080/user/2; - 返回:
{"id":2,"name":"小紅","age":19,"phone":"13900139000"},正確!
測試 3:查詢不存在的 ID(比如 3)
- 輸入:
http://localhost:8080/user/3; - 返回:
null(符合我們代碼里的邏輯)。
四、場景 2:問號傳參(接收多個可選參數(shù),如商品搜索)
需求:前端傳商品名稱(可選)和價格上限(可選),后端根據(jù)參數(shù)篩選商品列表(比如只傳名稱 “手機”,就返回所有手機;只傳價格上限 3000,就返回所有低于 3000 的商品;兩個都傳,就返回符合條件的手機)。
1. 寫接口:用@RequestParam接收問號參數(shù)
在ParamController里加一個商品搜索接口:
package com.example.firstspringbootproject.controller;
import com.example.firstspringbootproject.entity.Product;
import com.example.firstspringbootproject.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ParamController {
/*
接口2:問號傳參——商品搜索(名稱和價格上限都是可選參數(shù))
訪問路徑示例:/product/search?name=手機&maxPrice=3000
@RequestParam(required = false):表示這個參數(shù)是可選的,不傳也不會報錯
defaultValue = "": 表示如果參數(shù)沒傳,默認值是空字符串(針對String類型)
*/
@GetMapping("/product/search")
public List<Product> searchProduct(@RequestParam(required = false, defaultValue = "") String name, @RequestParam(required = false) Double maxPrice) {
//1.創(chuàng)建商品數(shù)據(jù)庫
List<Product> productDB = new ArrayList<>();
productDB.add(new Product(101, "華為手機", 3999.0, 100));
productDB.add(new Product(102, "蘋果平板", 5999.0, 50));
productDB.add(new Product(103, "小米耳機", 299.0, 200));
productDB.add(new Product(104, "OPPO手機", 2999.0, 80));
// 2. 創(chuàng)建一個空列表,用來裝篩選后的商品
List<Product> result = new ArrayList<>();
// 3. 遍歷“商品數(shù)據(jù)庫”,根據(jù)參數(shù)篩選
for (Product product : productDB) {
// 條件1:商品名稱包含傳入的name(如果name不為空)
boolean matchName = product.getProductName().contains(name);
// 條件2:商品價格小于等于傳入的maxPrice(如果maxPrice不為空)
boolean matchPrice = (maxPrice == null) || (product.getPrice() <= maxPrice);
// 兩個條件都滿足,就加入結果列表
if (matchName && matchPrice) {
result.add(product);
}
}
// 4. 返回篩選后的商品列表(Spring Boot自動轉JSON)
return result;
}
}
2. 關鍵說明(重點看@RequestParam)
required = false:表示這個參數(shù)是 “可選的”,前端可以不傳(如果不寫這個屬性,默認是required = true,前端不傳就會報錯);defaultValue = "":給參數(shù)設置 “默認值”,比如 name 的默認值是空字符串,這樣即使前端不傳 name,也不會是 null,避免后續(xù)代碼報錯;- 參數(shù)名對應:
@RequestParam括號里可以寫參數(shù)名(比如@RequestParam("productName")),如果括號里不寫,默認會找和方法參數(shù)名(比如name)一致的前端參數(shù)。
3. 測試接口(多場景測試,更能理解)
測試 1:只傳 “商品名稱”(搜索 “手機”)
- 訪問路徑:
http://localhost:8080/product/search?name=手機; - 篩選邏輯:名稱包含 “手機”,價格不限制;
- 返回結果:華為手機(3999)和 OPPO 手機(2999),正確!
測試 2:只傳 “價格上限”(maxPrice=3000)
- 訪問路徑:
http://localhost:8080/product/search?maxPrice=3000; - 篩選邏輯:價格≤3000,名稱不限制;
- 返回結果:小米耳機(299)和 OPPO 手機(2999),正確!
測試 3:兩個參數(shù)都傳(name = 手機 & maxPrice=3000)
- 訪問路徑:
http://localhost:8080/product/search?name=手機&maxPrice=3000; - 篩選邏輯:名稱包含 “手機” 且價格≤3000;
- 返回結果:只有 OPPO 手機(2999),正確!
測試 4:兩個參數(shù)都不傳
- 訪問路徑:
http://localhost:8080/product/search; - 篩選邏輯:所有商品都符合條件;
- 返回結果:所有 4 個商品,正確!
五、場景 3:請求體傳參(接收復雜 JSON 參數(shù),如用戶注冊)
需求:用戶注冊時,前端傳一個 JSON 格式的用戶信息(包含姓名、年齡、手機號),后端接收這些參數(shù),模擬 “保存用戶”,然后返回 “注冊成功” 的提示和保存后的用戶信息(包含自動生成的用戶 ID)。
1. 寫接口:用 “實體類” 接收請求體參數(shù)
在ParamController里加一個用戶注冊接口:
package com.example.firstspringbootproject.controller;
import com.example.firstspringbootproject.entity.Product;
import com.example.firstspringbootproject.entity.User;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ParamController {
// 模擬“用戶數(shù)據(jù)庫”:存注冊后的用戶
private List<User>userDB =new ArrayList<>();
// 模擬自增ID:每次注冊新用戶,ID+1
private Integer nextUserId = 3; // 之前已有ID=1、2的用戶,所以從3開始
/*
* 接口3:請求體傳參——用戶注冊(接收JSON格式的用戶信息)
* @PostMapping:表示這個接口用POST請求(前端傳請求體一般用POST,不用GET)
* @RequestBody:表示把請求體里的JSON數(shù)據(jù),轉換成User對象
*/
@PostMapping("/user/register")
public String registerUser(@RequestBody User user) {
// 1. 給新用戶設置自增ID(前端沒傳,后端自動生成)
user.setId(nextUserId);
nextUserId++; // 下次注冊ID+1
// 2. 模擬“保存用戶”:把用戶添加到“用戶數(shù)據(jù)庫”
userDB.add(user);
// 3. 返回注冊成功的提示(包含用戶信息)
return "注冊成功!你的用戶信息:" +
"ID=" + user.getId() +
",姓名=" + user.getName() +
",年齡=" + user.getAge() +
",手機號=" + user.getPhone();
}
}
2. 關鍵說明(重點看這 2 個注解)
@PostMapping:接收前端的 POST 請求(GET 請求一般用來 “查詢” 數(shù)據(jù),POST 請求用來 “提交” 數(shù)據(jù),比如注冊、提交訂單,這是開發(fā)中的規(guī)范);@RequestBody:把前端請求體里的 JSON 數(shù)據(jù),自動轉換成User實體類對象 —— 這里的關鍵是:JSON 里的字段名要和User類的屬性名完全一致(比如 JSON 里的 “name” 對應 User 類的private String name),否則無法正確賦值。
3. 測試接口(必須用 Apifox,瀏覽器沒法傳請求體)
測試步驟:
打開 Apifox,點擊左上角「+」新建快捷請求;
「Method」選擇「POST」,「URL」輸入:http://localhost:8080/user/register;
點擊「Body」→ 選擇「json」→ 右側下拉框選擇「JSON」,在輸入框里寫前端要傳的 JSON 數(shù)據(jù):
{
"name": "小李",
"age": 22,
"phone": "13700137000"
}
點擊右上角「Send」,查看返回結果:
- 「Response Body」里會顯示:
注冊成功!你的用戶信息:ID=3,姓名=小李,年齡=22,手機號=13700137000; - 狀態(tài)碼是 200,表示請求成功。
再測試一次:
再傳一個 JSON:
{
"name": "小李",
"age": 21,
"phone": "13600136000"
}
返回結果:注冊成功!你的用戶信息:ID=4,姓名=小張,年齡=21,手機號=13600136000,ID 自動增長,正確!
六、常見問題:接收參數(shù)時的小坑和解決方案
1. 路徑傳參時,參數(shù)名和占位符不一致,導致接收不到值?
- 比如路徑是
/user/{id},但注解寫的是@PathVariable("userId"),這樣就會匹配失??; - 解決方案:確保
@PathVariable括號里的名稱,和路徑里{}的名稱完全一致(比如@PathVariable("id"))。
2. 問號傳參時,前端傳了參數(shù),但后端接收的是 null?
原因 :前端傳的參數(shù)名和后端@RequestParam里的參數(shù)名不一致(比如前端傳product_name,后端用name);
3. 請求體傳參時,實體類屬性值是 null?
原因 :JSON 里的字段名和實體類屬性名不一致(比如 JSON 里是 “userName”,實體類是 “name”);
七、總結:3 種傳參方式怎么選
今天我們學完了接收前端參數(shù)的 3 種核心方式,最后用一張表幫你快速判斷該用哪種:
| 傳參方式 | 注解 / 方式 | 適用場景 | 示例 URL/JSON |
|---|---|---|---|
| 路徑傳參 | @PathVariable | 單個、簡單參數(shù)(如 ID、編號) | http://localhost:8080/user/1 |
| 問號傳參 | @RequestParam | 多個可選參數(shù)(如搜索條件) | http://localhost:8080/product/search?name=手機&maxPrice=3000 |
| 請求體傳參 | @RequestBody + 實體類 | 復雜、多字段參數(shù)(如注冊、提交訂單) | {"name":"小李","age":22,"phone":"13700137000"} |
到此這篇關于SpringBoot接收前端參數(shù)的最常用的場景和具體案例的文章就介紹到這了,更多相關SpringBoot接收前端參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot?加載本地jar到maven的實現(xiàn)方法
如何在SpringBoot項目中加載本地jar到Maven本地倉庫,使用Maven的install-file目標來實現(xiàn),本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2025-01-01
如何自定義Mybatis-Plus分布式ID生成器(解決ID長度超過JavaScript整數(shù)安全范圍問題)
MyBatis-Plus默認生成的是 64bit 長整型,而 JS 的 Number 類型精度最高只有 53bit,這篇文章主要介紹了如何自定義Mybatis-Plus分布式ID生成器(解決ID長度超過JavaScript整數(shù)安全范圍問題),需要的朋友可以參考下2024-08-08

