Qs.stringify(data)和JSON.stringify(data)使用后关于get和post区别及问题

116 阅读2分钟

有个旧项目,request封装了好几个,调接口跟许愿一样,时灵时不灵,得换着用。 看一下问题发生的原因,是封装的请求中,传参定了 Qs.stringify(data)和JSON.stringify(data) 的区别。

一、区别:
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");

参考文章

blog.csdn.net/weixin_4565…