springmvc控制器的正确使用

一、问题描述

想通过下面这个方法,接收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

五、附加参考链接:

  1. @RequestBody和@RequestParam区别
    http://www.cocoachina.com/articles/33133

  2. 对postman的body参数详解
    https://blog.csdn.net/qq_44993242/article/details/108280168

  3. @RequestBody和@RequestParam区别
    https://blog.csdn.net/weixin_38004638/article/details/99655322


六、其他坑

由于JavaBean类的成员变量命名不规范导致Controller方法的参数属性为null,该情况是定义了名为uId和dId的属性名导致的,类似的情况还有成员属性名全是大写(这堪称逆天而行)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值