如何在数组中正确使用 axios 参数
How to correctly use axios params with arrays
如何为查询字符串中的数组添加索引?
我试过这样发送数据:
axios.get('/myController/myAction', { params: { storeIds: [1,2,3] })
我得到了这个 url:
http://localhost/api/myController/myAction?storeIds[]=1&storeIds[]=2&storeIds[]=3
所以,我应该得到这个 url:
http://localhost/api/myController/myAction?storeIds[0]=1&storeIds[1]=2&storeIds[2]=3
我应该在我的参数选项中添加什么才能得到这个url?
您可以使用 paramsSerializer
并使用 https://www.npmjs.com/package/qs
序列化参数
axios.get('/myController/myAction', {
params: {
storeIds: [1,2,3]
},
paramsSerializer: params => {
return qs.stringify(params)
}
})
这对我来说更好:
axios.get('/myController/myAction', {
params: { storeIds: [1,2,3] + ''}
})
就我而言,我的代码库中已经实现了 jQuery。所以我只是使用了预定义的方法。
jQuery.param(Object)
非常感谢 Nicu Criste 的回答,对于我的情况,API 需要这样的参数:
params: {
f: {
key: 'abc',
categories: ['a','b','c']
},
per_page: 10
}
方法是 GET,这个 API 要求格式是:API?f[key]=abc&f[categories][]=a&f[categories][]=b...
所以我这样分配了axios的paramsSerializer:
config.paramsSerializer = p => {
return qs.stringify(p, {arrayFormat: 'brackets'})
}
- 安装
qs
请到this link
- 阅读 axios document
中有关 paramsSerializer 的更多信息
- 编辑参数格式:在 qs stringifying document
阅读更多内容
在我的例子中,我使用 ES6 数组函数。
数组元素使querystring 使用reduce 函数。
对象数组也可以。
const storeIds = [1,2,3]
axios.get('some url', {
params: {
storeIds: storeIds.reduce((f, s) => `${f},${s}`)
}
})
就我而言,我正在使用这样的东西
const params = array.map((v)=>{
return `p=${v}&`
})
仅将 params.join('')
连接到您获取数据的 URL:
`url_to_get?${params.join('')`
在我的后端 ASP.net 我收到了这个
[FromUri] string [] p
无需添加更多库并使用 ES6,您可以编写:
axios.get(`/myController/myAction?${[1,2,3].map((n, index) => `storeIds[${index}]=${n}`).join('&')}`);
我重写了 axios 中现有的 paramSerializer。以下代码片段执行相同的序列化,同时将索引放在方括号之间。我试过 qs 但它与我的 python 连接后端不兼容(对于 JSON 字符串参数)。
const rcg = axios.create({
baseURL: `${url}/api`,
paramsSerializer: params => {
const parts = [];
const encode = val => {
return encodeURIComponent(val).replace(/%3A/gi, ':')
.replace(/%24/g, '$')
.replace(/%2C/gi, ',')
.replace(/%20/g, '+')
.replace(/%5B/gi, '[')
.replace(/%5D/gi, ']');
}
const convertPart = (key, val) => {
if (val instanceof Date)
val = val.toISOString()
else if (val instanceof Object)
val = JSON.stringify(val)
parts.push(encode(key) + '=' + encode(val));
}
Object.entries(params).forEach(([key, val]) => {
if (val === null || typeof val === 'undefined')
return
if (Array.isArray(val))
val.forEach((v, i) => convertPart(`${key}[${i}]`, v))
else
convertPart(key, val)
})
return parts.join('&')
}
});
这对我有用:
axios.get("/financeiro/listar",{
params: {
periodo: this.filtro.periodo + "",
mostrarApagados: this.filtro.mostrarApagados,
mostrarPagos: this.filtro.mostrarPagos,
categoria: this.filtro.categoria,
conta: this.filtro.conta
}
})
我在使用“paramSerializer”时有点困惑。在寻找在 Google 上使用带有数组查询字符串的 axios 的“正确方法”之前,我做了以下工作并开始工作:
var options = {};
var params = {};
for(var x=0;x<Products.length;x++){
params[`VariableName[${x}]`] = Products[x].Id;
}
options.params = params;
axios.get(`https://someUrl/`, options)...
它将创建如下查询字符串参数:
VariableName[0]=XPTO,VariableName[1]=XPTO2
大多数网络服务器期望的数组格式
我知道这种方法不是很好,我也不知道它可能有什么缺点,但我试过了,它奏效了:
在发出请求之前,准备参数:
let params = '?';
for (let i = 0; i < YOUR_ARRAY.length; i++) { // In this case YOUR_ARRAY == [1, 2, 3]
params += `storeIds=${YOUR_ARRAY[i]}`; // storeIds is your PARAM_NAME
if (i !== YOUR_ARRAY.length - 1) params += '&';
}
然后像这样发出请求:
axios.get('/myController/myAction' + params)
此答案的灵感来自 。
但可能与发布的问题无关。
以下代码用于生成具有随对象数组提供的重复键的查询参数。
注意:如果您是 bundlephobia, use the following approach with care: as with UrlSearchParams support varies on different browsers and platforms 的开发者。
const queryParams = [{key1: "value1"}, {key2: "value2"}]
axios.get('/myController/myAction', {
params: queryParams,
paramsSerializer: params => {
return params.map((keyValuePair) => new URLSearchParams(keyValuePair)).join("&")
}
})
// request -> /myController/myAction?key1=value1&key2=value2
如何为查询字符串中的数组添加索引?
我试过这样发送数据:
axios.get('/myController/myAction', { params: { storeIds: [1,2,3] })
我得到了这个 url:
http://localhost/api/myController/myAction?storeIds[]=1&storeIds[]=2&storeIds[]=3
所以,我应该得到这个 url:
http://localhost/api/myController/myAction?storeIds[0]=1&storeIds[1]=2&storeIds[2]=3
我应该在我的参数选项中添加什么才能得到这个url?
您可以使用 paramsSerializer
并使用 https://www.npmjs.com/package/qs
axios.get('/myController/myAction', {
params: {
storeIds: [1,2,3]
},
paramsSerializer: params => {
return qs.stringify(params)
}
})
这对我来说更好:
axios.get('/myController/myAction', {
params: { storeIds: [1,2,3] + ''}
})
就我而言,我的代码库中已经实现了 jQuery。所以我只是使用了预定义的方法。
jQuery.param(Object)
非常感谢 Nicu Criste 的回答,对于我的情况,API 需要这样的参数:
params: {
f: {
key: 'abc',
categories: ['a','b','c']
},
per_page: 10
}
方法是 GET,这个 API 要求格式是:API?f[key]=abc&f[categories][]=a&f[categories][]=b...
所以我这样分配了axios的paramsSerializer:
config.paramsSerializer = p => {
return qs.stringify(p, {arrayFormat: 'brackets'})
}
- 安装
qs
请到this link - 阅读 axios document 中有关 paramsSerializer 的更多信息
- 编辑参数格式:在 qs stringifying document 阅读更多内容
在我的例子中,我使用 ES6 数组函数。 数组元素使querystring 使用reduce 函数。 对象数组也可以。
const storeIds = [1,2,3]
axios.get('some url', {
params: {
storeIds: storeIds.reduce((f, s) => `${f},${s}`)
}
})
就我而言,我正在使用这样的东西
const params = array.map((v)=>{
return `p=${v}&`
})
仅将 params.join('')
连接到您获取数据的 URL:
`url_to_get?${params.join('')`
在我的后端 ASP.net 我收到了这个
[FromUri] string [] p
无需添加更多库并使用 ES6,您可以编写:
axios.get(`/myController/myAction?${[1,2,3].map((n, index) => `storeIds[${index}]=${n}`).join('&')}`);
我重写了 axios 中现有的 paramSerializer。以下代码片段执行相同的序列化,同时将索引放在方括号之间。我试过 qs 但它与我的 python 连接后端不兼容(对于 JSON 字符串参数)。
const rcg = axios.create({
baseURL: `${url}/api`,
paramsSerializer: params => {
const parts = [];
const encode = val => {
return encodeURIComponent(val).replace(/%3A/gi, ':')
.replace(/%24/g, '$')
.replace(/%2C/gi, ',')
.replace(/%20/g, '+')
.replace(/%5B/gi, '[')
.replace(/%5D/gi, ']');
}
const convertPart = (key, val) => {
if (val instanceof Date)
val = val.toISOString()
else if (val instanceof Object)
val = JSON.stringify(val)
parts.push(encode(key) + '=' + encode(val));
}
Object.entries(params).forEach(([key, val]) => {
if (val === null || typeof val === 'undefined')
return
if (Array.isArray(val))
val.forEach((v, i) => convertPart(`${key}[${i}]`, v))
else
convertPart(key, val)
})
return parts.join('&')
}
});
这对我有用:
axios.get("/financeiro/listar",{
params: {
periodo: this.filtro.periodo + "",
mostrarApagados: this.filtro.mostrarApagados,
mostrarPagos: this.filtro.mostrarPagos,
categoria: this.filtro.categoria,
conta: this.filtro.conta
}
})
我在使用“paramSerializer”时有点困惑。在寻找在 Google 上使用带有数组查询字符串的 axios 的“正确方法”之前,我做了以下工作并开始工作:
var options = {};
var params = {};
for(var x=0;x<Products.length;x++){
params[`VariableName[${x}]`] = Products[x].Id;
}
options.params = params;
axios.get(`https://someUrl/`, options)...
它将创建如下查询字符串参数:
VariableName[0]=XPTO,VariableName[1]=XPTO2
大多数网络服务器期望的数组格式
我知道这种方法不是很好,我也不知道它可能有什么缺点,但我试过了,它奏效了:
在发出请求之前,准备参数:
let params = '?';
for (let i = 0; i < YOUR_ARRAY.length; i++) { // In this case YOUR_ARRAY == [1, 2, 3]
params += `storeIds=${YOUR_ARRAY[i]}`; // storeIds is your PARAM_NAME
if (i !== YOUR_ARRAY.length - 1) params += '&';
}
然后像这样发出请求:
axios.get('/myController/myAction' + params)
此答案的灵感来自
但可能与发布的问题无关。
以下代码用于生成具有随对象数组提供的重复键的查询参数。
注意:如果您是 bundlephobia, use the following approach with care: as with UrlSearchParams support varies on different browsers and platforms 的开发者。
const queryParams = [{key1: "value1"}, {key2: "value2"}]
axios.get('/myController/myAction', {
params: queryParams,
paramsSerializer: params => {
return params.map((keyValuePair) => new URLSearchParams(keyValuePair)).join("&")
}
})
// request -> /myController/myAction?key1=value1&key2=value2