为什么使用json传递请求参数时,后台实体接收不到参数

1. demo介绍

前几天测试接口的时候,以json的形式提交post请求数据,后台用一个实体类来接收参数,发现获取到的对象属性都为null。下面是我写的一个用于测试的小demo,来简单描述一下我所遇到的问题。

项目包含的目录结构如下:

User里面仅包含两个字段:username和password,如下:

UserController里面有一个测试接口,如下:

UserControllerTest是对该接口的测试,代码如下:

sendPost是对封装的一个POST请求函数,如下:

 

2. 问题描述

首先按照上面介绍的代码运行,后台是获取不到参数的,如下所示:

然后,使用postman进行请求也是同样的结果。问题的症结就是,为什么使用json传递请求参数时,后台实体接收不到参数,而使用表单提交时,却是可以接收到参数的。

这里说一下,下面这条语句是错误的:

因为,list.toString()不是json格式的,因此,使用fastjson将其转换成json格式的,再填充,修改如下:

 

3. 解决方案

(1)看到网上有人说要使用@RequestBody来接收,因此,修改代码如下:

运行结果:

  •  使用postman发送json请求,是可以得到请求参数。Json字符串如下:

  •  使用UserControllerTest的测试用例进行测试,得不到请求参数。后台输出一条警告,如下:

通过上面的警告信息我们可以看到,json解析失败。那么,初步怀疑可能还是json串的问题,将上述修改部分的结果单独打印出来,值如下所示:

备注:这里打印的是JSONObject.toJSON(list)的结果。显然,这并不是我们要传的json字符串。也就是说,使用json格式传参的时候,实际传入的并不是和实体类对应的json字符串,因此出现json解析失败。因此,修改代码如下:

运行程序,可以获取参数。

 

(2)通过上述方案,排除了测试代码的影响。但是,在之前一个公司写代码时,并没有使用@RequestBody,也是可以获取到json参数的。但是,我这里把@RequestBody去掉之后,是得不到json参数的,那这个又是什么原因呢?

首先通过百度,在这片博客中,遇到了类似的情况,但是使用了@RequestBody,和我们的问题还不一样,但是也值得看一看。链接如下:

https://blog.csdn.net/jiangjun0130/article/details/89210172

没办法,后来就去请教了前同事,才发现,之前的提交是采用表单提交的,所以没有用@RequestBody接收参数。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值