hesi726
hesi726
  • 发布:2019-08-14 17:55
  • 更新:2019-08-14 20:28
  • 阅读:992

【报Bug】request 时复杂请求参数的编码问题。。

分类:uni-app

下面是 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  
}
2019-08-14 17:55 负责人:无 分享
已邀请:
DCloud_UNI_GSQ

DCloud_UNI_GSQ

你描述的问题发生在哪端?(小程序?app?H5?)

另外:为什么不使用问题模板?
代码请使用代码块

该问题目前已经被锁定, 无法添加新回复