起源,axios GET请求默认不能随着 body 携带 JSON 参数 (尽管 JetBrains HTTP Client 本身是支持 GET 请求发送 JSON 的)
javascript
function ObjectToUrlParams(json = {}) {
const entries = []
for (const [k, v] of Object.entries(json)) { // 遍历键值对
if (Array.isArray(v)) { // 值是一个数组
const newKey = k + '[]' // 键改为 [] 结尾
v.forEach(function(el) {
let o = {}
o[newKey] = el
entries.push(...ObjectToUrlParams(o))
})
} else if (typeof v === 'object') { // 值是一个对象
for (const [k2, v2] of Object.entries(v)) { // 对象的某个键对应的值仍可能是对象或数组
const newKey = k+ "[" + k2 + "]"
if (Array.isArray(v2)) { // 二级值是数组
const newSubKey = newKey + '[]'
v2.forEach(function(elem) { // 对数组每个元素
let o = {}
o[newSubKey] = elem
entries.push(...ObjectToUrlParams(o)) // 递归获取后添加
})
} else if (typeof v2 === 'object') { // 二级值还是对象,递归获取值后添加
entries.push(...ObjectToUrlParams({newKey: v2}))
} else {
let o = {}
o[newKey] = v2
// console.log("Add: ", o)
entries.push(o)
}
}
} else { // 值不是对象,也不是数组
let o = {}
o[k] = v
// console.log("Add: ", o)
entries.push(o)
}
}
return entries;
}
function paramsArrayToString(paramsArray) {
let a = []
for (const kv of paramsArray) {
for (const [k, v] of Object.entries(kv)) {
a.push(k + '=' + v)
}
}
return a.join('&')
}
const json = {
k1: 'kk1',
k2: [
111, 222, 333
],
k3: {
k31: 'kk31',
k32: 'kk32',
},
k4: [
{k41: 444, k42: 445},
{k43: 'hello', k44: 'world'}
],
k5: {
k51: [7, 8, 9]
}
}
console.log(paramsArrayToString(ObjectToUrlParams(json)));
输出
bash
PS C:\Users\sjg20\AppData\Roaming\JetBrains\GoLand2026.1\scratches> node .\scratch.js
Add: { k1: 'kk1' }
Add: { 'k2[]': 111 }
Add: { 'k2[]': 222 }
Add: { 'k2[]': 333 }
Add: { 'k3[k31]': 'kk31' }
Add: { 'k3[k32]': 'kk32' }
Add: { 'k4[][k41]': 444 }
Add: { 'k4[][k42]': 445 }
Add: { 'k4[][k43]': 'hello' }
Add: { 'k4[][k44]': 'world' }
Add: { 'k5[k51][]': 7 }
Add: { 'k5[k51][]': 8 }
Add: { 'k5[k51][]': 9 }
k1=kk1&k2[]=111&k2[]=222&k2[]=333&k3[k31]=kk31&k3[k32]=kk32&k4[][k41]=444&k4[][k42]=445&k4[][k43]=hello&k4[][k44]=world&k5[k51][]=7&k5[k51][]=8&k5[k51][]=9