Axios参数中的多个值(逗号分隔)

时间:2018-09-24 15:01:47

标签: javascript vue.js axios

期望的查询字符串:

http://fqdn/page?categoryID=1&categoryID=2

Axios获取请求:

fetchNumbers () {
  return axios.get(globalConfig.CATS_URL, {
    params: {
      ...(this.category ? { categoryId: this.category } : {})
    }
  })
    .then((resp) => {
      // console.log(resp)
    })
    .catch((err) => {
      console.log(err)
    })
}

如您所见,它只对1个参数的1个值有效,但是如果我想制作多个值-它不起作用,我尝试使用数组:

...(this.category ? { categoryId: [1, 2] } : {})

但是它以这种方式返回:

http://fqdn/page?categoryID[]=1&categoryID[]=2

因此它不起作用。看过这个问题:Passing an object with a parameter with multiple values as a query string in a GET using axios

但是不知道他如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

这不是与axios相关的问题。这取决于您的后端服务是否能够以这种方式理解查询参数(似乎取决于框架)。从您的问题来看,当发送如下的queryParams时,我认为它不起作用

?categoryID[]=1&categoryID[]=2

并且期望

?categoryID = 1,2

您可以做的是先将数组转换为这样的字符串,然后再将其传递给axios中的params。更新代码中的以下内容,它应该可以解决您的问题。

...(this.category ? { categoryId: this.category.join(',') } : {})

看看下面的线程

How to pass an array within a query string?

答案 1 :(得分:1)

您可以使用Axios的paramsSerializer自定义请求中参数的序列化。

请注意,URLSearchParams按照您期望的方式序列化数组数据:

const searchParams = new URLSearchParams();
searchParams.append('foo', 1);
searchParams.append('foo', 2);
console.log(searchParams.toString()); // foo=1&foo=2

因此您可以在paramsSerializer中使用该类,如下所示:

// my-axios.js
export default axios.create({
  paramsSerializer(params) {
    const searchParams = new URLSearchParams();
    for (const key of Object.keys(params)) {
      const param = params[key];
      if (Array.isArray(param)) {
        for (const p of param) {
          searchParams.append(key, p);
        }
      } else {
        searchParams.append(key, param);
      }
    }
    return searchParams.toString();
  }
});

// Foo.vue
import axios from './my-axios.js';

export default {
  methods: {
    async send() {
      const { data } = await axios({
        url: '//httpbin.org/get',
        params: {
          categoryId: [1, 2, 3]
        }
      });

      // ...
    }
  }
}

demo