axios提交不了数组的问题

按照这个要求:

localhost/goods?ids[]=1&ids[]=2 

axios代码如下:

  var array = [1, 2];
  let json = JSON.stringify(array);
  console.log(json);
  axios.get('http://localhost/goods', json).then(function (res) {
  if (res.code == 200) {
   console.log("ok");
 }
}

上面的代码似乎有误,如何使用axios来实现这个URL请求方法?

阅读 3.3k
3 个回答

url 地址和请求体参数的序列化方式好像是不一样的,url 的参数序列化可以使用一个叫 qs 的包 调用 qs.stringify。
但是 axios会对url参数自动进行序列化,可以直接

axios.get('http://localhost/goods', {
  params: {ids: [1,2]}
})

就是你要的结果

var array = [1, 2];
let json = JSON.stringify(array);
json={ids:json};

不管用不用qs,数据都会被发送到后台。这个其实取决于后台怎么解析的,qs.stringify后的结果是ids[0]=1&ids[1]=2,跟后台约定好也是可以传的。
easy-mock测试的话,在Content-Type: application/json (axios 默认)条件下,都可以解析成功。而Content-Type: application/x-www-form-urlencoded(jquery ajax 默认)条件下,不使用qs则无法解析成功。
对于node后台,用原生的req.on('data')监听,总可以得到原始传送过来的值。
然而,我之前公司的后台用的springMVC,框架自己解析了请求内容,能够成功接受jquery 发送过来的请求,但是axios的不管用不用qs都无法顺利解析。我的做法是:1.设置Content-Type: application/x-www-form-urlencoded;2.使用URLSearchParams对参数进行处理

stringify: function(param){
        var newParam = new URLSearchParams();
        for(var name in param) {
            if(Array.isArray(param[name])){
                for (var val in param[name]) {
                    newParam.append(name+'[]', param[name][val]);
                }
            }else {
                newParam.append(name,param[name]);
            }
        }
        return newParam;
    },

这样最终得到的结果与jquery ajax 发过去的请求一样。当然,为了确保兼容性还需要引入一个polyfill

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题