背景
今天和同事联调单点登录时(我写前端,他写后端),发现使用PostAction传参后台接收不到,发现与使用的注解和content-type有关系,所以花了点时间进行了测试
问题
- 前端使用PostAction(url,params).then(res =>{xxx})传参
- 后端使用@PostMapping注解,参数列表不写注解,用String name接收
- 后端打印,name为null
解决
- 前端保持不变,后端改为用JavaBean接收,并加入@RequestBody注解
分析
- 上图截图于:https://www.cnblogs.com/dreamcc/p/10752604.html
- Content-Type的类型默认为application/x-www-form-urlencoded,但是axios默认的Content-Type为application/json,会以json字符串的形式发送到后端,所以String name肯定是接收不到的
- 注解@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中(https://blog.csdn.net/weixin_38004638/article/details/99655322),而QueryString可以理解为是url?后面的name=xxx&age=xx
- 注解@RequestBody是将post请求中内容转为一个整体对象
@RequestBody的解析有两个条件:
1.POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组);
2.@RequestBody注解的参数类型必须是完全可以接收参数值的类型,比如:Map,JSONObject,或者对应的JavaBean;所以Integer类型不能作为@RequestBody注解的参数类型
(https://blog.csdn.net/qfikh/article/details/88553603)
- 所以这里的Content-Type为application/json,且使用post方式传参,就必须使用@RequestBody JavaBean/Map/JsonObjct来接收;
- 之前失败是因为,传过来了json字符串,但是使用String name接收;
- 现在成功是因为,传过来了json字符串,使用@RequestBody和JavaBean接收,@RequestBody会将json字符串转为一个整体的对象
测试
![](https://img-blog.csdnimg.cn/20210513205847472.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hvdTk1NjY0Mzg4Mg==,size_16,color_FFFFFF,t_70)
自己使用Postman跑之后,得出上述图