在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); } }
测试结果如下:
持续更新中..........
详细请看:
Required request parameter ‘name‘ for method parameter type String is not present 报错解决方法_x@lijun的博客-CSDN博客