前几天邻座新来的前端同事和后台交互的时候遇到了一个问题:使用axios.post能发送请求后台亦能接收,但是数据不见了。联调时后台同事说着content-type类型不对导致的,看他们调了快1个小时还没解决,就跟着上去一看究竟,最后发现是前端发送的数据放在params中导致的(axios.post的数据是放在data中的,而get是放在params中)。
问题虽然解决了,还是想记录一下这次bug解决的思路以及相关的思考(其实也不能算bug)。
问题
这次项目是一个公司主要项目的国际mini版,后台为python,前端则是Vue + axios。
遇到的问题是前端发送的数据不能成功送出。
开始他们修改了headers.content-type的值,无效。
然后使用fetch来请求,能成功但是治标不治本。
排查
- Chrome打开F12,再次发送请求,看到请求头、响应头一切正常,后台返回的状态码是500,很明显是后台未能成功处理数据。
- 往下看到request.body无内容,此时可判断是前端未传出数据导致后台500错误。
- 查看代码,发现axios.post请求数据装在params中,打开文档确认应该是data。
- 将params修改为data,再次发送请求,问题解决
在此过程中和同事交流了get、post的区别,content-type类型的意义等话题,收获良多。
解决后的思考
虽然此次bug是由于前端没仔细看axios文档导致的,可能和但是在联调过程中所暴露出的问题也是显而易见。
- 使用框架但是不仔细看文档,致使该用data的时候用了params。
- 对HTTP的了解不够,content-type只是告知服务器请求的body该用什么方式解析。
- 后台眼中的ajax就是$.ajax,让前端用jQuery。
- 对axios库的本质不够理解。
后台口中所说的content-type类型其实和此次bug毫无关系
无论是axios还是$.ajax本质上都是对XMLHttpRequest对象的一些封装
jQuery^1.5.3之后使用自己封装的Deferred对象实现ajajx链式调用,axios则是使用Promise对象实现链式调用。
他们都是把原来冗长的回调ajax封装成了链式ajax。
这个原理明白后,我们就可以知道它们出现的问题其实本质是XMLHttpRequest的问题。
tips: 当请求体无内容时,设置content-type无效。
结语
可能很多人认为前端只是写写页面,从后台拿数据填到页面上就行了,至于其它的TCP/IP协议,用不到就不用去深入了解。
确实,如果只学习HTML、CSS、JS也能找到一份前端工作,但是这对职业的发展却有很大的限制,特别是当工作中遇到问题,如果连问题产生的原因都不知道,想去百度谷歌恐怕也找不到合适的关键字。
以上所言并非针对同事,仅是个人的一些思考。
前端路程尚远,时刻学习的心态不能放松。