一、区别:
1、首先Qs.stringify(data)和JSON.stringify(data)打印出来的内容不同,JSON.stringify(data)转完过后还是一个json对象的形式,Qs.stringify(data)转完以后就变成一长串的字符串了。
2、请求头不一样,
Qs.stringify(data)的请求头类型正常情况是:Content-Type: application/x-www-form-urlencoded
JSON.stringify(data)的请求头类型正常情况是:Content-Type: application/json
二、问题:
1、这时候就会有一个很奇怪的问题,就是你前端发送get请求的时候,不管你的参数是用Qs.stringify(data)还是JSON.stringify(data)转完以后在发送的,后端通过@RequestParam String terminalInfoList或者request.getParameter(“employeeNo”)这2种方式都是可以获取到的,为什么了?
原因:因为get请求参数都是以url的形式传递给你的,上面2种方式都是专门针对get获取参数的,刚好就都可以拿到。
2、但是如果你是通过post请求,前端是Qs.stringify(data)转换过后的参数,那么后端就不可以通过@RequestBody Map/实体类这种方式获取前端传递的参数,因为@RequestBody针对的请求头类型是:Content-Type: application/json,数据格式必须是JSON.stringify(data)
三、注意事项:
1、如果你使用的是JSON.stringify(data),就不需要操太多的心,后端不管是get还是post请求都能拿到参数。
2、如果你使用的是Qs.stringify(data),那么这个data中是多层的,既有单个的字符又有对象又有集合,那么对象和集合就得先用JSON.stringify(data)转换一下,要不然后端还是接受不到。
四、正确案列如下:
Qs.stringify(data)----Content-Type: application/x-www-form-urlencoded这种格式的:
前端:
saveTerminalInfo (data) {
service.hospitalGroupTargetManagement.saveTerminalInfo({
terminalInfoList: JSON.stringify(this.terminalInfo),
terminalBusinessList: JSON.stringify(this.businessList),
terminaBrandlList: JSON.stringify(this.productList),
searchInstitutionno: this.terminalInfo.institutionno,
no: this.terminalInfo.no.toString(),
employee: getFromCookie('employeeno')
}).then(res => {
})
},
return new Promise((resolve, reject) => {
axios.post(url, Qs.stringify(data)).then(response => {
if(response.status == 200){
resolve (response.data);
} else {
Notice.error({
title : '请求失败',
desc : '服务器异常信息:' + response.status
})
resolve('HTTP ERROR')
}
}).catch(error => {
Notice.error({
title : '请求失败',
desc : '服务器返回异常'
})
resolve('HTTP ERROR')
})
})
后端
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
@RequestMapping(value = "/apis/informationMaintenance/updateTerminal", method = RequestMethod.POST)
@ResponseBody
public ResultEntity updateTerminal(@RequestParam String terminalInfoList,@RequestParam String terminalBusinessList,@RequestParam String terminaBrandlList,@RequestParam String searchInstitutionno,
@RequestParam String no,@RequestParam String employee) {
ResultEntity<Integer> entity = new ResultEntity<>();
try {
//对象通过JSON.parse转换
Map<String,Object> terminalInfoListData =(Map<String,Object>) JSON.parse(terminalInfoList);
//集合通过JSONArray.parseArray转换
List terminalBusinessListData = JSONArray.parseArray(terminalBusinessList);
List terminaBrandlListData = JSONArray.parseArray(terminaBrandlList);
if (StringUtils.isBlank(searchInstitutionno) || StringUtils.isBlank(no) || StringUtils.isBlank(employee)) {
throw new Exception("必传参数不能为空");
}
entity.setData(distributionInfoMationService.updateTerminal(terminalInfoListData,terminalBusinessListData,terminaBrandlListData,searchInstitutionno,no,employee));
JSON.stringify(data):Content-Type: application/json这种格式的:
前端:
无需其他操作,发请求的时候直接转,axios的时候get请求用params,post用data。
return new Promise((resolve, reject) => {
axios.post(url, JSON.stringify(data)).then(response => {
if(response.status == 200){
resolve (response.data);
} else {
Notice.error({
title : '请求失败',
desc : '服务器异常信息:' + response.status
})
resolve('HTTP ERROR')
}
}).catch(error => {
Notice.error({
title : '请求失败',
desc : '服务器返回异常'
})
resolve('HTTP ERROR')
})
})
后端:
@RequestMapping(value = "/apis/informationMaintenance/updateTerminal", method = RequestMethod.POST)
@ResponseBody
public ResultEntity updateTerminal(@RequestBody Map<String,Object> allterminalInfoList) {
ResultEntity<Integer> entity = new ResultEntity<>();
try {
Map<String,Object> terminalInfoList =(Map<String,Object>) allterminalInfoList.get("terminalInfoList");
List<Map<String,Object>> terminalBusinessList =(List<Map<String,Object>>) allterminalInfoList.get("terminalBusinessList");
List<Map<String,Object>> terminaBrandlList =(List<Map<String,Object>>) allterminalInfoList.get("terminaBrandlList");
String searchInstitutionno =(String) allterminalInfoList.get("searchInstitutionno");
String no =(String) allterminalInfoList.get("no");
String employee =(String) allterminalInfoList.get("employee");