用axios发送post请求data里的数组怎么变成了对象

组件内请求:(第一次输出)

clipboard.png

store里的:

clipboard.png

api里的:

clipboard.png

config里的:(第二次输出)

clipboard.png

结果:

clipboard.png
orderlist,couponids里的数组变成了对象,怎么回事?

阅读 19.7k
3 个回答

我也遇到了这个问题,最终使用qs库解决了这个问题,具体代码段如下

return createRequest({
    url: url,
    method: 'post',
    params: params,
    data: data,
    transformRequest: [
      function (data) { // 解决传递数组变成对象的问题
        Object.keys(data).forEach((key) => {
          if ((typeof data[key]) === 'object') {
            data[key] = JSON.stringify(data[key]) // 这里必须使用内置JSON对象转换
          }
        })
        data = qs.stringify(data) // 这里必须使用qs库进行转换
        return data
      }
    ]
  })

重点是transformRequest这里,需要将参数转换一下。

上面的方案只是为了让传输看起来是json的格式,但是在实际使用过程中是因为我后端接收参数的姿势不对导致的,后端是用golang接收参数,修改了后端后原来的方式就可以解析为数组,不需要再进行这样的转换了。

axios遇到同样的问题, 因为接口定义入参必须是一个json, 不能用楼上的qs方案解决, 所以我写了一个递归实现了{0: xxx, 1: yyy}转换成标准数组 => [xxx, yyy]

...,
transformRequest: [
  function(data){
    return transformObjToArr(data);
  }
]

...
...

function transformObjToArr(data, isRoot=true){
  if(!data || typeof data !== 'object') return data;
  let dataNew = [];
  let keys = Object.keys(data);
  if(keys.includes('0')){
    keys.forEach(k => dataNew[k] = transformObjToArr(data[k], false));
  } else {
    keys.forEach(k => data[k] = transformObjToArr(data[k], false));
  }
  if(isRoot){
    return dataNew.length ? JSON.stringify(dataNew) : JSON.stringify(data);
  } else {
    return dataNew.length ? dataNew : data;
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏