SpringMVC获取Post请求参数的几种方式

后端使用实体类进行接收,前端传入Content-Type:application/json格式的数据

1
2
3
4
@PostMapping("/loginByUser")
public User loginByUser(@RequestBody User user) {
return user;
}

@RequestBody注解用于将请求体中的json字符串转化为java对象。

值得注意的是

  • 由于get无请求体,那么@RequestBody不能使用在get请求上。
  • @RequestBody与@RequestParam可以同时使用,@RequestBody最多只能有一个,而@RequestParam可以有多个。

后端使用实体类进行接收,前端传入Content-Type:application/x-www-form-urlencoded格式的数据

1
2
3
4
@PostMapping("/loginByUser")
public User loginByUser(User user) {
return user;
}

Content-Type:application/x-www-form-urlencoded格式的数据,数据会以key/value格式进行传输,SpringMVC会直接将请求体中的参数直接注入到对象中(注意名称匹配)。

后端使用参数进行接收,前端传入Content-Type:application/x-www-form-urlencoded格式的数据

1
2
3
4
5
@PostMapping("/loginByParam")
public User loginByParam(@RequestParam("name1") String name,
@RequestParam(value = "age", required = true, defaultValue = "20") int age) {
return new User(name, age);
}

@RequestParam可加可不加,根据属性名和参数是否匹配来判断。

后端使用Map来接收,前端传入Content-Type:application/x-www-form-urlencoded格式的数据

1
2
3
4
5
6
@PostMapping("/loginByMap")
public User loginByMap(@RequestParam Map<String, Object> map) {
String name = (String) map.get("name");
int age = Integer.parseInt((String) map.get("age"));
return new User(name, age);
}

这里类似于get请求,同样,map参数前需要加@RequestParam注解,用于将请求参数注入到map中。

值得注意的是,由于form表单形式是以key/value形式存储,都是字符串类型,因此需要将map.get(“age”)转化为String,再转化为Integer,最后再自动拆箱。

不可以将map.get(“age”)直接转化为Integer类型,因为其本质是String类型,String不能直接强转为Integer。

后端使用Map来接收,前端传入Content-Type:application/json格式的数据

1
2
3
4
5
6
@PostMapping("/loginByMap")
public User loginByMap(@RequestBody Map<String, Object> map) {
String name = (String) map.get("name");
int age = (Integer) map.get("age");
return new User(name, age);
}

同样,@RequestBody注解用于将请求体中的json字符串转化为对象属性,并注入到map中。

由于请求体中json中的age类型为number类型,因此注入到map中时,age是Integer类型,那么可以直接强转为Integer类型。

后端使用JSONObject来接收,前端传入Content-Type:application/json格式的数据

1
2
3
4
5
6
@PostMapping("/loginByJSONObject")
public User loginByJSONObject(@RequestBody JSONObject jsonObject) {
String name = jsonObject.getString("name");
int age = jsonObject.getInteger("age");
return new User(name, age);
}

@RequestBody注解用于将请求体中的json字符串转化为JSON对象。

后端使用数组来接收

1
2
3
4
@PostMapping("/array")
public Integer[] array(Integer[] a) {
return a;
}

前端传入Content-Type:application/x-www-form-urlencoded格式的数据,后端可以直接接收到。

但传入Content-Type:application/json格式的数据[1,2,3],后端则接收不到,需要加入@RequestBody注解。当然(@RequestBody List a)也是可以的。

总结:

@PathVariable、@RequestParam与@RequestBody注解三者的区别:

如果前端传入Content-Type:application/json格式的数据,直接使用@RequestBody注解将json字符串转化为对象。

如果前端传入Content-Type:application/x-www-form-urlencoded格式的数据,如果能够得出方法参数具有的属性和请求参数一样的属性时,则不需要@RequestParam注解。例如注入到Map中,则需要@RequestParam注解。

如果后端已经使用了@RequestBody注解,代表只接收application/json类型的数据,此时若再传入application/x-www-form-urlencoded类型的数据,则后台会报错。

另外,get请求的请求头没有Content-Type字段!

文章作者: GeYu
文章链接: https://nuistgy.github.io/2023/01/27/SpringMVC获取Post请求参数详解/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yu's Blog