axios发起POST请求返回200但数据库未更新、后端收到null如何解决
问题原因
你的问题核心是前端请求体格式和后端的解析逻辑不匹配,两种写法分别存在以下问题:
- 第一种写法如果存在全局axios拦截器修改了请求头/序列化规则,会导致发出去的JSON格式被篡改
- 第二种写法额外添加了
transformRequest用QS序列化嵌套对象,会把原本的JSON结构转成line[id]=xxx&stationList[0][name]=xxx格式的表单键值对,后端如果将请求体按JSON解析,会直接解析失败拿到null changeOrigin是webpack devServer的代理配置项,写在axios请求配置中完全无效,属于多余配置
修复方案
1. 前端请求修改为标准JSON格式提交
删除多余的序列化配置,明确指定请求头为JSON格式:
axios({ method: "post", url: "api/nosql/LineController/insertLine", headers: { "Content-Type": "application/json;charset=utf-8" }, data: { line:{ id:this.id, directional:this.directional, kilometer:this.slide1.distance, runtime:runtime, interval:this.slide2.shift, type:this.type, }, stationList: this.newPlatforms, } })
2. 后端添加日志排查原始请求体
在后端接收代码中添加日志,确认拿到的请求体是否为合法JSON:
public Object insertLine(HttpServletRequest request) throws IOException { StringBuffer lineInfoAndStations = new StringBuffer(); String line; BufferedReader reader; reader = request.getReader(); while(null != (line = reader.readLine())) { lineInfoAndStations.append(line); } // 新增日志打印,确认请求体格式 System.out.println("原始请求体:" + lineInfoAndStations.toString()); return service.addLine(lineInfoAndStations.toString()); }
如果日志打印出的是表单格式的键值对,检查全局axios拦截器是否有强制序列化请求体的逻辑,删掉对应配置即可;如果打印的是合法JSON字符串,检查service层的JSON解析逻辑是否和你提交的字段名、字段类型匹配。
内容的提问来源于stack exchange,提问作者SNORLAX
相关产品推荐
相关产品推荐

