排查Vue 使用POST请求方式给TP接口传参失败问题
在进行前后端分析开发的时候,前端使用的是element-admin框架进行开发,后台使用的是TP5框架,不管哪个版本TP都无法接收Vue项目POST传过来的参数。然而使用工具(postman)那些都能让后台成功接收POST过来的参数,唯独Vue不行,刚开始以为是没有解决跨域问题,但是前端设置代理之后并且后台也设置了跨域,GET请求方式的传参就能让后台成功获取到参数。排除跨域的原因。当使用POST请求传参时,数据明明已经提交了,在打开F12开发工具的时候,点击network里面的确有数据已经传过去,只是后台那里,打印日志确实没有获取到传来的参数。网上找了不少资料,然后进行一一排查,自己是什么原因导致问题的出现。网上基本上说是数据格式问题
我是在element-admin项目中进行了一系列的尝试
尝试过程:
1. 提交的数据形式变为:FormData
测试例子使用的是element-admin项目
安装qs插件,项目根目录执行命令:
npm install qs -S
2. 设置全局变量
在main.js中设置全局标量$axios等,此操作是便于可以在所有Vue文件中使用axios插件。
import axios from 'axios'
import qs from 'qs'
Vue.prototype.$qs = qs;
Vue.prototype.$axios = axios;
3. 然后在请求方法中使用
我这里直接使用使用axios,看看我这个问题是不是数据格式不对引起的。后端接口URL为:http://192.168.3.167:86/admin/Storeproduct/CateEdit,在表单页面中定义编辑数据方法updateData,然后在方法中直接使用axios请求后台接口。方法如下所示:
updateData() {
let data = {
id: 1,
cate_name: 'hengbenyinhe',
sort: this.temp.sort,
}
this.$axios.post('http://192.168.3.167:86/admin/Storeproduct/CateEdit',qs.stringify(data)).then((resp) => {
console.log('111',resp)
})
},
调用updateData方法则对后台请求成功。
问题原因
主要原因是发送的数据格式不对。Vue的axios传参方式是requestpayload,参数格式是json,而通过payload形式的数据php $_post无法接受前端提交的数据,要想后端接受post提交的数据,就要进行参数设置,提交的数据形式变为:Form Data。PPOS表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使用原生AJAX的POST请求如果不指定请求头RequestHeader,默认使用的Content-Type是text/plain;charset=UTF-8,Content-Type是:
Content-Type: application/json; charset=utf-8
Date: Tue, 27 Oct 2020 05:38:27 GMT
既然找到了原因,就可以有解决方法。
解决方式
将传递的json数据转为form data
1.安装qs
终端执行
npm install qs -S
2.使用qs.stringify将数据转为form data
以上为我自己问题的解决办法,其他具体问题还需要具体分析。