- 为什么有的接口直接写 dto 就能接收参数?
@pathvariable、@requestparam、@requestbody到底什么时候用?- get 请求能不能传 json?路径参数和查询参数怎么区分?
- 省市区联动接口该如何设计传参和返回值?
本文结合真实业务代码,用最通俗的语言,把 springboot 接口传参的所有核心知识点讲透,新手看完直接上手!
一、springboot 三大传参方式(核心必背)
springboot 接口传参分为 3 种标准场景,对应不同的请求类型和业务需求,严格遵循 http 协议规范。
url 查询参数(? 后面的参数)→ 最常用
适用场景:get 请求、查询列表、多条件筛选、省市区联动等获取数据的场景接收写法:直接写 dto / 实体类,无需任何注解,spring 自动封装参数前端传参:/api/linkage?parentid=0&level=1
// 你的省市区联动接口(标准查询参数写法)
@getmapping("/linkage")
public apiresponse<list<countryareaoptiondto>> linkage(
@valid countryarealinkagequerydto request // 自动封装所有查询参数
) {
return apiresponse.success(countryareadoservice.querylinkage(request));
}
路径参数(/xxx/{id})→ 操作单个资源
适用场景:根据唯一 id查询 / 删除 / 修改单个资源(restful 规范)接收写法:必须加 @pathvariable 注解前端传参:/api/area/1001
// 查询单个地区详情(路径参数写法)
@getmapping("/area/{areaid}")
public apiresponse<countryareado> getareabyid(
@pathvariable long areaid // 接收路径中的id
) {
return apiresponse.success(countryareadoservice.getbyid(areaid));
}
json 请求体参数 → 增 / 改数据
适用场景:post/put 请求、提交大量数据、复杂对象参数接收写法:必须加 @requestbody 注解前端传参:json 格式放在请求体中
// 新增地区(json参数写法)
@postmapping("/area/save")
public apiresponse<boolean> savearea(
@requestbody countryareado areado // 接收json参数
) {
return apiresponse.success(countryareadoservice.save(areado));
}
三大传参方式对比表
表格
| 传参方式 | 请求类型 | 核心注解 | 业务场景 |
|---|---|---|---|
| url 查询参数 | get | 无(直接写 dto) | 查询列表、筛选、联动 |
| 路径参数 | get/delete | @pathvariable | 单资源查 / 删 / 改 |
| json 请求体 | post/put | @requestbody | 新增、修改、提交复杂数据 |
二、关键区分:dto 自动封装 vs @requestparam
新手最容易混淆:加不加 @requestparam 的区别,一句话搞定:
- 不加注解:自动把前端所有参数封装成 dto 对象
- 加
@requestparam:只提取前端的单个参数
不加注解 → 自动封装 dto
前端传多个参数,spring 自动匹配字段,封装成对象:
// 前端:?parentid=0&level=1 → 自动封装进dto
@getmapping("/linkage")
public apiresponse linkage(countryarealinkagequerydto request) {}
加@requestparam→ 提取单个参数
只需要前端的某一个参数,单独接收:
// 只接收 provinceid 这一个参数
@getmapping("/cities")
public apiresponse cities(@requestparam long provinceid) {}
禁忌
千万不要给 dto 加 @requestparam,会直接报错!
三、核心铁律:get 请求绝对不用 json
这是 http 协议的固定规则,企业开发强制遵守:
- get 请求没有请求体,强行传 json 会被服务器丢弃
- get 参数只能放在 url 中,适合查询、非敏感数据
- 只有 post/put 才用 json 参数
四、实战案例:省市区多级联动接口设计
结合你的业务需求,不修改数据库、不新增字段,纯后端实现省市区联动,完整方案如下:
前端传参规则
- 查省份:
/provinces(parentid=0) - 查城市:
/cities?provinceid=xxx - 查区县:
/districts?cityid=xxx - 通用接口:
/linkage?parentid=xxx
后端核心代码(层级判断逻辑)
不靠数据库 level 字段,纯通过父 id 判断省 / 市 / 区:
// 核心联动查询方法
public list<countryareaoptiondto> querylinkage(long parentid) {
// 1. 查询当前层级数据
list<countryareado> areas = parentid == null
? list(wrappers.<countryareado>lambdaquery().isnull(countryareado::getpid))
: list(wrappers.<countryareado>lambdaquery().eq(countryareado::getpid, parentid));
// 2. 获取所有父id集合(判断是否有子节点)
set<long> parentids = list(wrappers.<countryareado>lambdaquery().isnotnull(countryareado::getpid))
.stream().map(countryareado::getpid).collect(collectors.toset());
// 3. 自动判断层级:省/市/区
return areas.stream().map(area -> tooption(area, level, parentids)).tolist();
}
// 层级判断规则
parentid == null ? 省份 : parentids.contains(area.getid()) ? 市 : 区
3. 前端接收 dto(标准返回值)
@data
public class countryareaoptiondto {
private long id; // 下一级查询的parentid
private string name; // 前端展示名称
private string level; // 层级编码
private string leveldesc; // 省/市/区
private boolean haschildren; // 是否有子节点
}
五、新手常见问题:为什么项目不能本地启动?
很多新手发现:有的项目能启动,有的不能,核心原因只有一个:项目运行环境 / 配置不满足,和项目本身无关!
最常见 4 个启动失败原因
- 端口被占用:8080 端口被其他软件占用
- 数据库连接失败:mysql 未启动、账号密码错误
- maven 依赖未下载完:代码全红,编译失败
- 配置文件语法错误:yml 缩进错误
10 秒排查方法
看控制台第一行红字:
- 含
port→ 换端口 - 含
mysql→ 检查数据库 - 含
dependency→ 重新加载 maven
六、新手必背口诀(记住永不踩坑)
- 查数据用 get,参数放?后面,直接写 dto
- 单资源查改删,用路径参数,加 @pathvariable
- 增改数据用 post,传 json,加 @requestbody
- 不加注解封 dto,加注解取单个参数
- get 不用 json,路径参数只传 id
总结
本文覆盖了 springboot 接口传参的所有核心知识点,结合省市区联动真实业务,从基础用法到实战设计,彻底解决新手传参困惑。
springboot 传参没有复杂逻辑,严格遵循规范,结合业务场景选择对应的方式,就能写出规范、可维护的接口代码!
以上就是新手必懂的springboot接口传参全攻略:查询参数/路径参数/json 参数的详细内容,更多关于springboot接口传参的资料请关注代码网其它相关文章!
发表评论