一、问题描述
想通过下面这个方法,接收postman的post请求,但参数为null;
方法截图:
postman传参截图:
二、分析
- 注意:post请求是可以接收url上的参数的。
@PostMapping("/login")
public R login(@RequestBody User user){ return new R()}
- (@RequestBody User user)封装的是body中的数据。
- 前端请求的参数为json数据,参数在body里,是安全的。
- 前端请求的参数为params数据,参数在url上,是不安全的。
@PostMapping("/login")
public R login(User user){return new R()}
- User user接收的是url上的参数,而不是body中的参数。
三、总结:
1、无论是@RequestMapping,@PostMapping,@GetMapping,被@ReqeustBody修饰的形参只能接收body中的json数据。没有被@RequestBody修饰的形参只能接收url中的数据,也就是postman的Params中填的数据。
2、get请求有长度限制,post请求则没有。
简而言之:
(@RequestBody User user) 封装的是body中的数据。
(User user) 封装的是url中的数据。
—end
补充一:
如果想要上边的方法中String userName,String userPwd接收到Post请求带过来的参数,该Post请求的请求头中Content-Type须为application/x-www-form-urlencoded;也就是以表单的形式提交。
而下面这个基于layui的jquery提交post请求的时候,Content-Type正为application/x-www-form-urlencoded,也就是一种表单请求,从而让上面的controller方法中可以接收到参数。这就是为什么在这个jquery提交的post请求是正常的,而postman中带json格式数据的请求却是失败的原因,我把这个post请求当成了普通的post请求,其实这是一个表单提交。
—end
补充:
四、@RequestBody的错误使用。
问题描述:控制器方法的形参上加上@RequsetBody注解,导致Ajax的表单提交报415异常。
后端提示信息:
Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
答案:
@RequsetBody注解常用来处理content-type是application/json编码的内容,而不能用来处理application/x-www-form-urlcoded编码的内容;
注意:上面过程是基于springboot的项目,如果是ssm的项目请参考如下链接:
https://blog.csdn.net/mufeng__/article/details/81388789
五、附加参考链接:
-
@RequestBody和@RequestParam区别
http://www.cocoachina.com/articles/33133 -
对postman的body参数详解
https://blog.csdn.net/qq_44993242/article/details/108280168 -
@RequestBody和@RequestParam区别
https://blog.csdn.net/weixin_38004638/article/details/99655322
六、其他坑
由于JavaBean类的成员变量命名不规范导致Controller方法的参数属性为null,该情况是定义了名为uId和dId的属性名导致的,类似的情况还有成员属性名全是大写(这堪称逆天而行)