原因是没有对参数进行序列化
默认情况下,axios将JavaScript对象序列化为JSON。 要以应用程序/ x-www-form-urlencoded格式发送数据。
在拦截器前修改
方法一,用原生js序列化参数
// 创建axios实例 const service = axios.create({baseURL: process.env.BASE_API, // api 的 base_urltimeout: 30000, // 请求超时时间transformRequest: [function(data) {const str = []for (const i in data) {str.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i]))}return str.join('&')}] })
方法二,用qs序列化参数
//npm install axios的时候默认会安装qs // qs相关的问题请搜索"nodejs qs"或者看这里https://www.npmjs.com/package/qs import qs from 'qs';const service = axios.create({baseURL: process.env.BASE_API, // api 的 base_urltimeout: 30000, // 请求超时时间 transformRequest: [function(data) {return qs.stringify(data, {arrayFormat: 'brackets'})}] })
网上方案说要加
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
我没有加,因为我发现默认axios的post就是x-www-form-urlencoded。
到此,这个问题解决了