在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(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博客