下面是 uni.request 的源代码,很明显,如果我提交一个如下的数据
{ name: 'dd', roomCount: 1, rooms: [{ name: '501' }] }
并且不使用 json 方式提交, 数据是提交不过去的。。
因为下面的代码使用了这个方式进行数据的转码:
else if (contentType === 'urlencoded') {
let bodyArray = []
for (let key in data) {
if (data.hasOwnProperty(key)) {
bodyArray.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
}
}
body = bodyArray.join('&')
}
很明显, encodeURIComponent({ name: 'dd', roomCount: 1, rooms: [{ name: '501' }] } ) 是无法正确对对象进行编码的;
而使用另外的编码方式, 例如 下面的代码,
encodeURI(getUrlString({ name: 'dd', roomCount: 1, rooms: [{ name: '501' }] }));
可以获得如下编码结果 :
name=dd&roomCount=1&rooms%5B%5D%5Bname%5D=501
这个参数是可以直接提交到服务器而让服务器成功解析的(并且此函数和之前的代码完全兼容),
那么,当 contentType === 'urlencoded' 时,贵公司能否改用下面的函数对传入的 data 对象进行编码呢?
getUrlString (params, keys = [], isArray = false) {
const p = Object.keys(params).map(key => {
let val = params[key]
if ("[object Object]" === Object.prototype.toString.call(val) || Array.isArray(val)) {
if (Array.isArray(params)) {
keys.push("")
} else {
keys.push(key)
}
return getUrlString(val, keys, Array.isArray(val))
} else {
let tKey = key
if (keys.length > 0) {
const tKeys = isArray ? keys : [...keys, key]
tKey = tKeys.reduce((str, k) => { return "" === str ? k : `${str}[${k}]` }, "")
}
if (isArray) {
return `${ tKey }[]=${ val }`
} else {
return `${ tKey }=${ val }`
}
}
}).join('&')
keys.pop()
return p
}
1 个回复
DCloud_UNI_GSQ
你描述的问题发生在哪端?(小程序?app?H5?)
另外:为什么不使用问题模板?
代码请使用代码块