背景
axios提交post的请求时,会常用到contentType="application/x-www-form-urlencoded",将data由json转换为form格式,提交到axios的data也会使用qs.stringify(data)转换后再发送。
但如果data中含有字段值为空对象、空字符串、空数组时({},'',[]),在网络请求能看到发送的数据中,这些空值对应的字段都会消失,有些情况是不希望消失的。
问题定位
从查阅qs文档看到,是qs对这些空值做了忽略处理。
当一个key对应的值为空时(空数组,空对象),没有返回值
assert.equal(qs.stringify({ a: [] }), '');
assert.equal(qs.stringify({ a: {} }), '');
assert.equal(qs.stringify({ a: [{}] }), '');
assert.equal(qs.stringify({ a: { b: []} }), '');
assert.equal(qs.stringify({ a: { b: {}} }), '');
解决办法
将空数组转换为null,再传提交请求,因为qs.stringify时默认不跳过null值(skipNulls: false)。
也可以在转换为null后,使用qs.stringify(config.data, {arrayFormat: 'repeat'})。