【问题标题】:Axios multiple values (comma separated) in a parameteraxios一个参数中有多个值(逗号分隔)
【发布时间】:2018-09-24 15:01:46
【问题描述】:

预期的查询字符串:

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

但想不通,他是如​​何解决这个问题的。

【问题讨论】:

    标签: javascript vue.js axios


    【解决方案1】:

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

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

    它期望

    ?categoryID = 1,2
    

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

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

    看看下面的帖子

    How to pass an array within a query string?

    【讨论】:

    • 我假设this.category 应该是一个数组,对吧>
    • @AlexanderKim 是的,根据您的问题,它是一个数组。类别 ID:[1, 2]
    • 我不太明白,我在上面的代码中显示了...(this.category ? { categoryId: [1, 2] } : {}) 我只是硬编码了一个数组,得到了结果?categoryID[]=1&categoryID[]=2 你建议这样做吗?如果我错了,请纠正我
    • @AlexanderKim 我建议 categoryId: [1, 2].join(',')
    【解决方案2】:

    可以使用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

    【讨论】:

    • 谢谢,async / await 在这里干什么?
    • async/await 是 ES2017 功能。
    • 如果您的项目中没有 ES2017,您可以使用 ES2016 等效代码:send() { axios(...).then(response => { const data = response.data; }); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2021-09-24
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多