關(guān)于@RequestBody,@PathVariable,無注解使用及說明
參數(shù)注解使用場景完整指南
1. @RequestBody 使用場景
核心特征:
- HTTP方法:主要用于 POST、PUT、PATCH
- 數(shù)據(jù)來源:HTTP請求體 (Request Body)
- Content-Type:通常是
application/json
適用場景:
// 場景1:用戶登錄 - 敏感數(shù)據(jù)
@PostMapping("/login")
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
// 原因:用戶名密碼敏感,需要在請求體中加密傳輸
}
// 場景2:新增員工 - 復(fù)雜對象
@PostMapping
public Result save(@RequestBody EmployeeDTO employeeDTO) {
// 原因:多個(gè)字段的復(fù)雜對象,JSON格式更清晰
}
// 場景3:修改員工信息 - 更新操作
@PutMapping
public Result update(@RequestBody EmployeeDTO employeeDTO) {
// 原因:修改操作通常用PUT,需要傳遞完整對象
}
// 場景4:批量操作
@PostMapping("/batch")
public Result batchSave(@RequestBody List<EmployeeDTO> employees) {
// 原因:批量數(shù)據(jù),數(shù)組/列表格式
}
2. @PathVariable 使用場景
核心特征:
- 數(shù)據(jù)來源:URL路徑中的變量部分
- 用途:資源標(biāo)識符,符合RESTful設(shè)計(jì)
- HTTP方法:GET、PUT、DELETE等
適用場景:
// 場景1:根據(jù)ID查詢 - 資源標(biāo)識
@GetMapping("/{id}")
public Result<Employee> getById(@PathVariable Long id) {
// URL: /admin/employee/123
// 原因:ID是資源的唯一標(biāo)識符
}
// 場景2:根據(jù)ID刪除 - 資源操作
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id) {
// URL: /admin/employee/123
// 原因:明確指定要?jiǎng)h除的資源
}
// 場景3:狀態(tài)切換 - 動(dòng)作+資源
@PostMapping("/status/{status}")
public Result startOrStop(@PathVariable Integer status, Long id) {
// URL: /admin/employee/status/1?id=123
// 原因:status是操作類型,屬于URL路徑的一部分
}
// 場景4:多級資源路徑
@GetMapping("/department/{deptId}/employees/{empId}")
public Result getEmployeeInDept(@PathVariable Long deptId, @PathVariable Long empId) {
// URL: /admin/department/10/employees/123
// 原因:表示部門下的特定員工資源
}
3. 無注解使用場景
核心特征:
- 數(shù)據(jù)來源:URL查詢參數(shù) (Query Parameters)
- 用途:查詢條件、過濾參數(shù)、分頁參數(shù)
- HTTP方法:主要是GET
適用場景:
// 場景1:分頁查詢 - 查詢條件
@GetMapping("/page")
public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO) {
// URL: /admin/employee/page?name=張&page=1&pageSize=10
// 原因:簡單查詢條件,支持緩存和書簽
}
// 場景2:簡單參數(shù)查詢
@GetMapping("/search")
public Result<List<Employee>> search(String keyword, Integer status) {
// URL: /admin/employee/search?keyword=張三&status=1
// 原因:簡單的過濾條件
}
// 場景3:可選參數(shù)查詢
@GetMapping("/list")
public Result<List<Employee>> list(String department, Integer level) {
// URL: /admin/employee/list?department=IT&level=2
// 原因:可選的查詢條件,可以為空
}
詳細(xì)對比表格
| 注解類型 | HTTP方法 | 數(shù)據(jù)位置 | 使用場景 | URL示例 | 優(yōu)缺點(diǎn) |
|---|---|---|---|---|---|
| @RequestBody | POST/PUT/PATCH | 請求體 | 復(fù)雜對象、敏感數(shù)據(jù)、批量操作 | POST /employee + JSON | ?復(fù)雜數(shù)據(jù) ?不支持緩存 |
| @PathVariable | GET/PUT/DELETE | URL路徑 | 資源標(biāo)識符、層級資源 | GET /employee/123 | ?RESTful ?語義清晰 |
| 無注解 | GET | URL參數(shù) | 查詢條件、分頁、過濾 | GET /employee?name=張&page=1 | ?支持緩存 ?書簽友好 |
實(shí)際項(xiàng)目中的應(yīng)用示例
員工管理模塊完整示例
@RestController
@RequestMapping("/admin/employee")
public class EmployeeController {
// 1. 登錄 - @RequestBody (敏感數(shù)據(jù))
@PostMapping("/login")
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO dto) {
// POST /admin/employee/login + JSON
}
// 2. 新增 - @RequestBody (復(fù)雜對象)
@PostMapping
public Result save(@RequestBody EmployeeDTO dto) {
// POST /admin/employee + JSON
}
// 3. 分頁查詢 - 無注解 (查詢條件)
@GetMapping("/page")
public Result<PageResult> page(EmployeePageQueryDTO dto) {
// GET /admin/employee/page?name=張&page=1&pageSize=10
}
// 4. 根據(jù)ID查詢 - @PathVariable (資源標(biāo)識)
@GetMapping("/{id}")
public Result<Employee> getById(@PathVariable Long id) {
// GET /admin/employee/123
}
// 5. 修改 - @RequestBody (更新對象)
@PutMapping
public Result update(@RequestBody EmployeeDTO dto) {
// PUT /admin/employee + JSON
}
// 6. 啟用禁用 - @PathVariable + 無注解 (狀態(tài)+ID)
@PostMapping("/status/{status}")
public Result startOrStop(@PathVariable Integer status, Long id) {
// POST /admin/employee/status/1?id=123
}
// 7. 刪除 - @PathVariable (資源標(biāo)識)
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id) {
// DELETE /admin/employee/123
}
}
決策流程圖
是否傳輸復(fù)雜對象或敏感數(shù)據(jù)?
├─ 是 → 使用 @RequestBody (POST/PUT + JSON)
└─ 否 → 是否資源標(biāo)識符?
├─ 是 → 使用 @PathVariable (/{id})
└─ 否 → 無注解 (URL參數(shù),GET請求)
記憶口訣
- @RequestBody = “復(fù)雜敏感批量” (復(fù)雜對象、敏感數(shù)據(jù)、批量操作)
- @PathVariable = “資源標(biāo)識符” (ID、路徑參數(shù)、RESTful)
- 無注解 = “查詢過濾分頁” (查詢條件、過濾器、分頁參數(shù))
特殊場景說明
混合使用場景
// 組合1:路徑參數(shù) + 查詢參數(shù)
@GetMapping("/department/{deptId}/employees")
public Result getEmployeesByDept(@PathVariable Long deptId,
String keyword,
Integer page) {
// GET /admin/department/10/employees?keyword=張&page=1
}
// 組合2:路徑參數(shù) + 請求體
@PutMapping("/{id}")
public Result update(@PathVariable Long id,
@RequestBody EmployeeDTO dto) {
// PUT /admin/employee/123 + JSON
// ID確定資源,DTO包含更新數(shù)據(jù)
}
總結(jié)
這三種注解的選擇遵循以下原則:
- @RequestBody - 數(shù)據(jù)復(fù)雜度高、安全性要求高、修改操作
- @PathVariable - 資源定位、RESTful風(fēng)格、層級關(guān)系
- 無注解 - 查詢場景、性能優(yōu)化、用戶體驗(yàn)
選擇正確的注解不僅能讓代碼更規(guī)范,還能提升API的性能和用戶體驗(yàn)!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解析Flink內(nèi)核原理與實(shí)現(xiàn)核心抽象
Flink API提供了開發(fā)的接口,此外,為了實(shí)現(xiàn)業(yè)務(wù)邏輯,還必須為開發(fā)者提供自定義業(yè)務(wù)邏輯的能力,下面為大家解析Flink內(nèi)核原理與實(shí)現(xiàn)核心抽象2021-08-08
Spring如何通過@Lazy注解解決構(gòu)造方法循環(huán)依賴問題
循環(huán)依賴其實(shí)就是循環(huán)引用,也就是兩個(gè)或則兩個(gè)以上的bean互相持有對方,最終形成閉環(huán),這篇文章主要給大家介紹了關(guān)于Spring如何通過@Lazy注解解決構(gòu)造方法循環(huán)依賴問題的相關(guān)資料,需要的朋友可以參考下2023-03-03
java使用Apache工具集實(shí)現(xiàn)ftp文件傳輸代碼詳解
這篇文章主要介紹了java使用Apache工具集實(shí)現(xiàn)ftp文件傳輸代碼詳解,分享了詳細(xì)連接ftp server和上傳文件,下載文件的代碼,以及結(jié)果展示,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
Java之使用POI教你玩轉(zhuǎn)Excel導(dǎo)入與導(dǎo)出
這篇文章主要介紹了Java之使用POI教你玩轉(zhuǎn)Excel導(dǎo)入與導(dǎo)出,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
Java數(shù)據(jù)結(jié)構(gòu)BFS廣搜法解決迷宮問題
廣搜BFS的基本思想是: 首先訪問初始點(diǎn)v并將其標(biāo)志為已經(jīng)訪問。接著通過鄰接關(guān)系將鄰接點(diǎn)入隊(duì)。然后每訪問過一個(gè)頂點(diǎn)則出隊(duì)。按照順序,訪問每一個(gè)頂點(diǎn)的所有未被訪問過的頂點(diǎn)直到所有的頂點(diǎn)均被訪問過。廣度優(yōu)先遍歷類似與層次遍歷2022-04-04
SpringBoot整合EasyExcel實(shí)現(xiàn)批量導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)批量導(dǎo)入導(dǎo)出功能的相關(guān)知識,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下2024-03-03

