1. 背景
- 写一个普通的post方法接口时,使用swagger测试接口无误。与前端对接时,出现传递参数为null的问题。
//这是接口方法
@PostMapping(value = "/getValue")
@ApiOperation("设置值")
public Object getValue(Integer value) {
......
}
//js代码
postValue: data => {
return request({
url: '/.../getValue',
method: 'post',
data
})
查看前端发现传递参数为:
{"value" : "-1"}
2. 过程
-
- 使用swagger自测 返回结果符合预测结果
-
- 使用postman自测 返回结果报参数为null的错误
- 发现原因是前端不能将参数传递后端。查阅资料,总共有以下几种可能
- 1、没有使用RequestParam、RequestBody注解
- 2、不能接收Integer类型,只能接收String类型数据
- 3、前端传递方式不对
一一尝试之后出现以下情况:
- 对于第一种情况
使用RequestParam、RequestBody时出现报错500 并出现:Required String parameter ‘param‘ is not present 。这种问题很少出现,一般是报400。百度后解决方案是将RequestParam注解后加Required = false。但是后端必须要这个参数,所以不可行,pass。 - 对于第二种情况:
查阅资料可以发现与数据类型无关 - 对于第三种情况:
- 将前端改成下面的形式,可以正常运行,但是参数是在url中的
postValue: data => {
return request({
url: '/.../getValue',
method: 'post',
params:{
'value':data
}
})
前端提出post方法不能 将参数放在url中。再次查阅资料发现:后端使用post方法接收单个参数时,前端只能使用FormData格式或x-www-form-urlencoded格式来传递数据,不能使用json传递数据。
3. 原因
后端使用post方法接收单个参数时,前端使用json传递数据会接收不到,只能使用formdata或x-www-form-urlencoded传递数据
4. 解决方案
- 实际解决方法有很多种,本次只是记录post方法接收单个参数出现后端接收不到问题。
如: - 使用get方法接收参数
- 接收以JSON传输的字符串,即以字符串的方式接收该数据,然后用JSON解析
- 以及本次的解决方案:使用formdata传输数据;