问题复现
- 在 Sping MVC 中我们经常使用 @RequestParam 注解来获取请求传入的参数。
- 正常情况下可以正常使用不会产生问题,当传入的参数过大时就会出现参数不全的情况。
- 下有一段控制器代码如下:
@RestController
public class ApiController{
@PostMapping("in")
public ResponseMessage inbound(@RequestParam Map params) {
System.out.println(params);
}
}
- 以上代码当传入的请求参数过长时就会出现参数获取不全的情况。
解决方式
方式一:使用 @RequestBody 注解
- 这种方式传入的数据必须要在请求体内才可以获取到数据。
- 示例代码:
@RestController
public class ApiController{
@PostMapping("in")
public ResponseMessage inbound(@RequestBody Map data) {
System.out.println(data);
}
}
方式二:使用 request.getParameterMap() 方法
- 这种方式是通过原生的 HttpServletRequest 对象来获取传入的参数。
- 示例代码:
@RestController
public class ApiController{
@PostMapping("in")
public ResponseMessage inbound(HttpServletRequest request) {
Map<String,String[]> paramMap = request.getParameterMap();
}
}
- 获取到的 Map 值是一个字符串数组类型,获取第一个字符串就可以获取到对应的数据。
- 字符串数组是为了参数中一个参数名多次赋值的的情况一般我们获取第一个就好。