新手必懂的SpringBoot接口傳參全攻略:查詢參數(shù)/路徑參數(shù)/JSON?參數(shù)
- 為什么有的接口直接寫 DTO 就能接收參數(shù)?
@PathVariable、@RequestParam、@RequestBody到底什么時(shí)候用?- GET 請(qǐng)求能不能傳 JSON?路徑參數(shù)和查詢參數(shù)怎么區(qū)分?
- 省市區(qū)聯(lián)動(dòng)接口該如何設(shè)計(jì)傳參和返回值?
本文結(jié)合真實(shí)業(yè)務(wù)代碼,用最通俗的語(yǔ)言,把 SpringBoot 接口傳參的所有核心知識(shí)點(diǎn)講透,新手看完直接上手!
一、SpringBoot 三大傳參方式(核心必背)
SpringBoot 接口傳參分為 3 種標(biāo)準(zhǔn)場(chǎng)景,對(duì)應(yīng)不同的請(qǐng)求類型和業(yè)務(wù)需求,嚴(yán)格遵循 HTTP 協(xié)議規(guī)范。
URL 查詢參數(shù)(? 后面的參數(shù))→ 最常用
適用場(chǎng)景:GET 請(qǐng)求、查詢列表、多條件篩選、省市區(qū)聯(lián)動(dòng)等獲取數(shù)據(jù)的場(chǎng)景接收寫法:直接寫 DTO / 實(shí)體類,無(wú)需任何注解,Spring 自動(dòng)封裝參數(shù)前端傳參:/api/linkage?parentId=0&level=1
// 你的省市區(qū)聯(lián)動(dòng)接口(標(biāo)準(zhǔn)查詢參數(shù)寫法)
@GetMapping("/linkage")
public ApiResponse<List<CountryAreaOptionDTO>> linkage(
@Valid CountryAreaLinkageQueryDTO request // 自動(dòng)封裝所有查詢參數(shù)
) {
return ApiResponse.success(countryAreaDOService.queryLinkage(request));
}
路徑參數(shù)(/xxx/{id})→ 操作單個(gè)資源
適用場(chǎng)景:根據(jù)唯一 ID查詢 / 刪除 / 修改單個(gè)資源(RESTful 規(guī)范)接收寫法:必須加 @PathVariable 注解前端傳參:/api/area/1001
// 查詢單個(gè)地區(qū)詳情(路徑參數(shù)寫法)
@GetMapping("/area/{areaId}")
public ApiResponse<CountryAreaDO> getAreaById(
@PathVariable Long areaId // 接收路徑中的ID
) {
return ApiResponse.success(countryAreaDOService.getById(areaId));
}
JSON 請(qǐng)求體參數(shù) → 增 / 改數(shù)據(jù)
適用場(chǎng)景:POST/PUT 請(qǐng)求、提交大量數(shù)據(jù)、復(fù)雜對(duì)象參數(shù)接收寫法:必須加 @RequestBody 注解前端傳參:JSON 格式放在請(qǐng)求體中
// 新增地區(qū)(JSON參數(shù)寫法)
@PostMapping("/area/save")
public ApiResponse<Boolean> saveArea(
@RequestBody CountryAreaDO areaDO // 接收J(rèn)SON參數(shù)
) {
return ApiResponse.success(countryAreaDOService.save(areaDO));
}
三大傳參方式對(duì)比表
表格
| 傳參方式 | 請(qǐng)求類型 | 核心注解 | 業(yè)務(wù)場(chǎng)景 |
|---|---|---|---|
| URL 查詢參數(shù) | GET | 無(wú)(直接寫 DTO) | 查詢列表、篩選、聯(lián)動(dòng) |
| 路徑參數(shù) | GET/DELETE | @PathVariable | 單資源查 / 刪 / 改 |
| JSON 請(qǐng)求體 | POST/PUT | @RequestBody | 新增、修改、提交復(fù)雜數(shù)據(jù) |
二、關(guān)鍵區(qū)分:DTO 自動(dòng)封裝 vs @RequestParam
新手最容易混淆:加不加 @RequestParam 的區(qū)別,一句話搞定:
- 不加注解:自動(dòng)把前端所有參數(shù)封裝成 DTO 對(duì)象
- 加
@RequestParam:只提取前端的單個(gè)參數(shù)
不加注解 → 自動(dòng)封裝 DTO
前端傳多個(gè)參數(shù),Spring 自動(dòng)匹配字段,封裝成對(duì)象:
// 前端:?parentId=0&level=1 → 自動(dòng)封裝進(jìn)DTO
@GetMapping("/linkage")
public ApiResponse linkage(CountryAreaLinkageQueryDTO request) {}
加@RequestParam→ 提取單個(gè)參數(shù)
只需要前端的某一個(gè)參數(shù),單獨(dú)接收:
// 只接收 provinceId 這一個(gè)參數(shù)
@GetMapping("/cities")
public ApiResponse cities(@RequestParam Long provinceId) {}
禁忌
千萬(wàn)不要給 DTO 加 @RequestParam,會(huì)直接報(bào)錯(cuò)!
三、核心鐵律:GET 請(qǐng)求絕對(duì)不用 JSON
這是 HTTP 協(xié)議的固定規(guī)則,企業(yè)開(kāi)發(fā)強(qiáng)制遵守:
- GET 請(qǐng)求沒(méi)有請(qǐng)求體,強(qiáng)行傳 JSON 會(huì)被服務(wù)器丟棄
- GET 參數(shù)只能放在 URL 中,適合查詢、非敏感數(shù)據(jù)
- 只有 POST/PUT 才用 JSON 參數(shù)
四、實(shí)戰(zhàn)案例:省市區(qū)多級(jí)聯(lián)動(dòng)接口設(shè)計(jì)
結(jié)合你的業(yè)務(wù)需求,不修改數(shù)據(jù)庫(kù)、不新增字段,純后端實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng),完整方案如下:
前端傳參規(guī)則
- 查省份:
/provinces(parentId=0) - 查城市:
/cities?provinceId=xxx - 查區(qū)縣:
/districts?cityId=xxx - 通用接口:
/linkage?parentId=xxx
后端核心代碼(層級(jí)判斷邏輯)
不靠數(shù)據(jù)庫(kù) level 字段,純通過(guò)父 ID 判斷省 / 市 / 區(qū):
// 核心聯(lián)動(dòng)查詢方法
public List<CountryAreaOptionDTO> queryLinkage(Long parentId) {
// 1. 查詢當(dāng)前層級(jí)數(shù)據(jù)
List<CountryAreaDO> areas = parentId == null
? list(Wrappers.<CountryAreaDO>lambdaQuery().isNull(CountryAreaDO::getPid))
: list(Wrappers.<CountryAreaDO>lambdaQuery().eq(CountryAreaDO::getPid, parentId));
// 2. 獲取所有父ID集合(判斷是否有子節(jié)點(diǎn))
Set<Long> parentIds = list(Wrappers.<CountryAreaDO>lambdaQuery().isNotNull(CountryAreaDO::getPid))
.stream().map(CountryAreaDO::getPid).collect(Collectors.toSet());
// 3. 自動(dòng)判斷層級(jí):省/市/區(qū)
return areas.stream().map(area -> toOption(area, level, parentIds)).toList();
}
// 層級(jí)判斷規(guī)則
parentId == null ? 省份 : parentIds.contains(area.getId()) ? 市 : 區(qū)
3. 前端接收 DTO(標(biāo)準(zhǔn)返回值)
@Data
public class CountryAreaOptionDTO {
private Long id; // 下一級(jí)查詢的parentId
private String name; // 前端展示名稱
private String level; // 層級(jí)編碼
private String levelDesc; // 省/市/區(qū)
private boolean hasChildren; // 是否有子節(jié)點(diǎn)
}
五、新手常見(jiàn)問(wèn)題:為什么項(xiàng)目不能本地啟動(dòng)?
很多新手發(fā)現(xiàn):有的項(xiàng)目能啟動(dòng),有的不能,核心原因只有一個(gè):項(xiàng)目運(yùn)行環(huán)境 / 配置不滿足,和項(xiàng)目本身無(wú)關(guān)!
最常見(jiàn) 4 個(gè)啟動(dòng)失敗原因
- 端口被占用:8080 端口被其他軟件占用
- 數(shù)據(jù)庫(kù)連接失敗:MySQL 未啟動(dòng)、賬號(hào)密碼錯(cuò)誤
- Maven 依賴未下載完:代碼全紅,編譯失敗
- 配置文件語(yǔ)法錯(cuò)誤:yml 縮進(jìn)錯(cuò)誤
10 秒排查方法
看控制臺(tái)第一行紅字:
- 含
port→ 換端口 - 含
MySQL→ 檢查數(shù)據(jù)庫(kù) - 含
dependency→ 重新加載 Maven
六、新手必背口訣(記住永不踩坑)
- 查數(shù)據(jù)用 GET,參數(shù)放?后面,直接寫 DTO
- 單資源查改刪,用路徑參數(shù),加 @PathVariable
- 增改數(shù)據(jù)用 POST,傳 JSON,加 @RequestBody
- 不加注解封 DTO,加注解取單個(gè)參數(shù)
- GET 不用 JSON,路徑參數(shù)只傳 ID
總結(jié)
本文覆蓋了 SpringBoot 接口傳參的所有核心知識(shí)點(diǎn),結(jié)合省市區(qū)聯(lián)動(dòng)真實(shí)業(yè)務(wù),從基礎(chǔ)用法到實(shí)戰(zhàn)設(shè)計(jì),徹底解決新手傳參困惑。
SpringBoot 傳參沒(méi)有復(fù)雜邏輯,嚴(yán)格遵循規(guī)范,結(jié)合業(yè)務(wù)場(chǎng)景選擇對(duì)應(yīng)的方式,就能寫出規(guī)范、可維護(hù)的接口代碼!
以上就是新手必懂的SpringBoot接口傳參全攻略:查詢參數(shù)/路徑參數(shù)/JSON 參數(shù)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot接口傳參的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中Object類常用的12個(gè)方法(小結(jié))
Java 中的 Object 方法在面試中是一個(gè)非常高頻的點(diǎn),本文主要介紹了Java中Object類常用的12個(gè)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Java完全二叉樹(shù)的創(chuàng)建與四種遍歷方法分析
這篇文章主要介紹了Java完全二叉樹(shù)的創(chuàng)建與四種遍歷方法,結(jié)合實(shí)例形式分析了完全二叉樹(shù)的概念、定義及遍歷操作相關(guān)實(shí)現(xiàn)技巧,并對(duì)比分析了滿二叉樹(shù)與完全二叉樹(shù)的區(qū)別,需要的朋友可以參考下2017-11-11
Java利用iTextPDF庫(kù)實(shí)現(xiàn)制作PDF表格模板并填充數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Java的iTextPDF庫(kù)制作一個(gè)PDF表格模板并填充數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12
SpringBoot定時(shí)任務(wù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)同步全過(guò)程
文章詳細(xì)介紹了從簡(jiǎn)單到企業(yè)級(jí)數(shù)據(jù)庫(kù)同步需求的技術(shù)方案,包括選型、實(shí)現(xiàn)步驟、優(yōu)化方案、異常處理策略、生產(chǎn)環(huán)境配置建議等2025-12-12
SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法
這篇文章主要介紹了SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
JavaSE多線程阻塞隊(duì)列實(shí)現(xiàn)代碼
阻塞隊(duì)列是一種線程安全的隊(duì)列,可以用于多線程之間的數(shù)據(jù)傳遞和同步,下面這篇文章主要介紹了JavaSE多線程阻塞隊(duì)列的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-12-12
如何在springboot項(xiàng)目中自定義404頁(yè)面
今天點(diǎn)擊菜單的時(shí)候不小心點(diǎn)開(kāi)了一個(gè)不存在的頁(yè)面,然后看到瀏覽器給的一個(gè)默認(rèn)的404頁(yè)面,這篇文章主要介紹了如何在springboot項(xiàng)目中自定義404頁(yè)面,需要的朋友可以參考下2024-05-05

