如何正确使用axios params与数组

Zin*_*Kun 18 javascript arrays http-get axios

如何在查询字符串中向数组添加索引?

我尝试发送这样的数据:

axios.get('/myController/myAction', { params: { storeIds: [1,2,3] })
Run Code Online (Sandbox Code Playgroud)

我得到了这个网址:

http://localhost/api/myController/myAction?storeIds[]=1&storeIds[]=2&storeIds[]=3
Run Code Online (Sandbox Code Playgroud)

所以,我应该得到这个网址:

http://localhost/api/myController/myAction?storeIds[0]=1&storeIds[1]=2&storeIds[2]=3
Run Code Online (Sandbox Code Playgroud)

我应该在我的params选项中添加什么来获取此URL?

Nic*_*ste 16

您可以paramsSerializer通过https://www.npmjs.com/package/qs使用和序列化参数

axios.get('/myController/myAction', {
  params: {
    storeIds: [1,2,3]
  },
  paramsSerializer: params => {
    return qs.stringify(params)
  }
})
Run Code Online (Sandbox Code Playgroud)

  • 我使用 `qs.stringify(params, { arrayFormat: "repeat" })` 而不仅仅是 `qs.stringify(params)` 让它工作 这个答案也有帮助:/sf/answers/3230744611/ 9195642 (8认同)
  • 甚至 axios 文档也只是“顺便”提到了 paramsSerializer (4认同)
  • 由于 1.0.0 axios 原生支持,只需将 paramsSerializer.indexes 设置为 null 即可。参考:https://github.com/axios/axios#request-config (4认同)
  • 帮助了很多......在尝试弄清楚如何自己构建参数时陷入了困境。 (2认同)

Alb*_*ght 16

此行为已添加到axios从 version 开始1.0.0。请paramsSerializer.indexes参阅https://github.com/axios/axios/tree/v1.0.0#request-config

这是使用您的示例代码的示例:

axios.get('/myController/myAction', {
  params: { storeIds: [1,2,3] },
  paramsSerializer: {
    indexes: true, // use brackets with indexes
  }
)
Run Code Online (Sandbox Code Playgroud)

生成的查询参数将在括号内包含索引:

/myController/myAction?storeIds[0]=1&storeIds[1]=2&storeIds[2]=3
Run Code Online (Sandbox Code Playgroud)

其他paramsSerializer.indexes值是null(无括号):

axios.get('/myController/myAction', {
  params: { storeIds: [1,2,3] },
  paramsSerializer: {
    indexes: null, // no brackets at all
  }
)
// /myController/myAction?storeIds=1&storeIds=2&storeIds=3
Run Code Online (Sandbox Code Playgroud)

和默认值false(没有索引的括号):

axios.get('/myController/myAction', {
  params: { storeIds: [1,2,3] },
  paramsSerializer: {
    indexes: false, // brackets but no indexes
  }
)
// /myController/myAction?storeIds[]=1&storeIds[]=2&storeIds[]=3
Run Code Online (Sandbox Code Playgroud)


Heo*_*des 8

非常感谢Nicu Criste的回答,就我而言,API 需要这样的参数:

params: {
  f: {
    key: 'abc',
    categories: ['a','b','c']
   },
  per_page: 10
}
Run Code Online (Sandbox Code Playgroud)

方法是GET,这个API要求的格式是:API?f[key]=abc&f[categories][]=a&f[categories][]=b... 所以我这样分配了axios的paramsSerializer:

config.paramsSerializer = p => {
      return qs.stringify(p, {arrayFormat: 'brackets'})
    }
Run Code Online (Sandbox Code Playgroud)


Ser*_*iza 6

无需添加更多库并使用 ES6,您可以编写:

axios.get(`/myController/myAction?${[1,2,3].map((n, index) => `storeIds[${index}]=${n}`).join('&')}`);
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案!这是纯JS。无需图书馆! (3认同)
  • 仅供参考,Axios 是一个图书馆。https://github.com/axios/axios (2认同)
  • 为了让它工作,我做了 .map((n, index) => `storeIds[${index}]=${n}`).join('&') 否则因为 .map 返回一个数组我有进行加入。否则,每个值之间会出现不需要的“,”符号。 (2认同)