SpringBoot后端接口请求参数映射方式详解

本文详细介绍了在SpringBoot项目中,前端HTTP请求的参数如何映射到Controller层接口方法的参数,包括QueryString方式、对象类型参数、数组和集合类型参数、路径参数以及请求体JSON方式。测试和总结了各种方式的使用方法和注意事项,如@RequestParam和@PathVariable的使用场景及其差异。
摘要由CSDN通过智能技术生成

在SpringBoot项目中,前端HTTP请求中的参数如何映射到Controller层的接口方法中的参数?这里针对各种方式做一个测试与总结。


1:QueryString方式

  • QueryString参数传递的方式为,在请求URL中直接拼接请求参数如:URL?param1=value1&param2=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);
    }

}
测试结果如下:

4cdec32351dc46f2bddde2e2adc7c509.png

  • 如果请求参数名称和Controller中接口方法的参数名称一致,那么可以省略@RequestParam注解。不过一般还是建议加上
    当请求参数名称和Controller中接口方法的参数名称一致时,加与不加@RequestParam的区别是:
        加上@RequestParam,其属性required默认为true,那么当前端不传递对应的参数时将会抛出异常

963890dcf090442d89769ae84013ca1a.png

  • 不加@RequestParam,前端可以不传递对应参数,此时Controller接口方法中的参数接收到的值为null

78811c233bb34ead9d9f716dbc6d1a19.png

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());
}
测试结果如下:

18ec09ed236f4b19a71549b404d8d601.png

3.映射数组、集合类型参数

前端有2种方式针对同一个参数传递多个值:

    在请求的QueryString中,拼接多个参数名称一样的参数即可,如URL?param=value1&param=value2&param=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);
        }
    }
}

 测试结果如下:

e0a56e7c2c3f46508a359d4dbe1e6953.png

 804e9a52d39642e8a7f0ecdf7c7eb45c.png

如果请求参数名称和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);
        }
    }
}

 

测试结果如下:

795d7540c8224ad8b94f962540e60fd9.png


 

@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);
}

测试结果:

cbcb11b93d1d4b49a70b3c45ebe8c40e.png

 

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());
    }
}
测试结果如下:

6872a4ec6f954c8bb6242a96e4c0e41f.png

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());
    }
}

 

测试结果如下:

bf3a3646ad7741fe9af1334415e74ec2.png

 

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);
    }
}
测试结果如下:

99dd7da3735345c897a4112ddacbd579.png

持续更新中..........

详细请看:

Required request parameter ‘name‘ for method parameter type String is not present 报错解决方法_x@lijun的博客-CSDN博客

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入夏忆梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值