在SpringBoot项目中,前端HTTP请求中的参数如何映射到Controller层的接口方法中的参数?这里针对各种方式做一个测试与总结。
1:QueryString方式
- QueryString参数传递的方式为,在请求URL中直接拼接请求参数如:URL?param1=value1¶m2=value2,
映射基本类型参数
- 可以在Controller的接口中声明基本类型的参数,然后用@RequestParam注解修饰,指定前端传递的参数名称
@RestController
@RequestMapping("param")
@Slf4j
public class RequestParamTestController {
@GetMapping("queryString1")
public void testQueryString1(@RequestParam("name") String name,
@RequestParam("age") Integer age) {
log.info("name:{} age:{}", name, age);
}
}
测试结果如下:
-
如果请求参数名称和Controller中接口方法的参数名称一致,那么可以省略@RequestParam注解。不过一般还是建议加上 当请求参数名称和Controller中接口方法的参数名称一致时,加与不加@RequestParam的区别是: 加上@RequestParam,其属性required默认为true,那么当前端不传递对应的参数时将会抛出异常
-
不加@RequestParam,前端可以不传递对应参数,此时Controller接口方法中的参数接收到的值为null
2:映射对象类型参数
-
定义一个对象,属性名称和前端传递的参数名称一致即可
@Data
public class User {
private String name;
private Integer age;
}
-
然后将Controller接口方法中的参数声明为自定义对象:
@GetMapping("queryString2")
public void testQueryString2(@RequestBody User user) {
log.info("name:{} age:{}", user.getName(), user.getAge());
}
测试结果如下:
3.映射数组、集合类型参数
前端有2种方式针对同一个参数传递多个值:
在请求的QueryString中,拼接多个参数名称一样的参数即可,如URL?param=value1¶m=value2¶m=value3
在请求的QueryString中,对同一个参数赋多个值,多个值之间用,隔开,如URL?param=value1,value2,value3
3.1 映射数组
在Controller接口方法中声明数组类型参数,用@RequestParam指明前端传递的参数名称即可
@GetMapping("queryString3")
public void testQueryString3(@RequestParam("name") String[] nameArray) {
if (nameArray != null) {
for (String name : nameArray) {
log.info(name);
}
}
}
测试结果如下:
如果请求参数名称和Controller中接口方法的参数名称一致,那么可以省略@RequestParam注解。不过一般还是建议加上
4:映射List
在Controller接口方法中声明List类型参数,用@RequestParam指明前端传递的参数名称即可
@RequestMapping("queryString5")
public void testQueryString5(@RequestParam("name") List<String> nameList) {
if (nameList != null) {
log.info("类型:{}", nameList.getClass());
for (String name : nameList) {
log.info(name);
}
}
}
测试结果如下:
@RequestMapping("path1/{name}/{age}")
public void testPath1(@PathVariable("name") String name, @PathVariable("age") Integer age) {
log.info("name:{} age:{}", name, age);
}
5:路径参数方式 restful 风格
-
路径传参方式是将参数直接包含在URL路径中,比如URL/paramValue1/paramValue2
路径参数方式对于请求方法GET、POST、PUT、PATCH、DELETE都适用
-
1.映射基本类型参数 在Controller中用如下步骤接收参数: 在接口对应的请求路径中用{参数名}形式标出路径参数 在接口方法的参数上标注@PathVariable指名对应路径参数的参数名
@RequestMapping("path1/{name}/{age}")
public void testPath1(@PathVariable("name") String name,
@PathVariable("age") Integer age) {
log.info("name:{} age:{}", name, age);
}
测试结果:
5.1 映射数组、集合类型参数
直接给路径参数多个值,用,隔开即可
2.1 映射数组
在Controller接口方法中声明数组类型参数,用@PathVariable指明路径参数的名称即可
@RequestMapping("path2/{name}/{age}")
public void testPath2(@PathVariable("name") String[] nameArray,
@PathVariable("age") Integer[] ageArray) {
for (String name : nameArray) {
log.info(name);
}
for (Integer age : ageArray) {
log.info(age.toString());
}
}
测试结果如下:
2.2 映射List
@RequestMapping("path4/{name}/{age}")
public void testPath4(@PathVariable("name") List<String> nameList,
@PathVariable("age") List<Integer> ageList) {
log.info("类型:{}", nameList.getClass());
for (String name : nameList) {
log.info(name);
}
for (Integer age : ageList) {
log.info(age.toString());
}
}
测试结果如下:
6:请求体json方式
参数传递方式对于请求方法POST、PUT、PATCH、DELETE都适用 但是不适合Get 请求
@RestController
@RequestMapping("param")
@Slf4j
public class RequestParamTestController {
@PostMapping("queryString1")
public void testQueryString1(@RequestBody("name") String name,
@RequestBody("age") Integer age) {
log.info("name:{} age:{}", name, age);
}
}
测试结果如下:
持续更新中……….
详细请看:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/121363.html