uni-app uni.request post 请求参数对象有字段是数组,序列化有问题
uni-app uni.request post 请求参数对象有字段是数组,序列化有问题
示例代码:
uni.request({
url: 'xxx',
method:'post',
data: {
ids: [ ]
}
})
操作步骤:
uni.request({
url: 'xxx',
method:'post',
data: {
ids: [ ]
}
})
预期结果:
SpringBoot 后端报错
Cannot deserialize value of type `java.util.ArrayList<java.lang.String>` from Object value (token `JsonToken.START_OBJECT`)
实际结果:
正常
信息类别 | 详细信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Mac |
PC开发环境版本 | Mac OS 15.1 (24B2082) |
HBuilderX类型 | Alpha |
HBuilderX版本 | 4.33 |
手机系统 | HarmonyOS NEXT |
手机系统版本 | HarmonyOS NEXT Developer Preview |
手机厂商 | 华为 |
手机机型 | mate 60 pro |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
JSON.stringify([]) 试试
不行
4.33alpha版本的uni. request方法应该是有问题,post请求里面的字段有数组类型,后端都报错,应该是用的Harmony Next的请求库,对数组数据类型没有处理好
“ids”:[] 在发送网络请求前会被处理成这种:
“ids”:{“length”:0}
在使用 uni-app 进行开发时,如果遇到 uni.request
的 POST 请求参数对象中包含数组字段,并且该数组字段在序列化时出现问题,通常可以通过以下几种方式来解决。这里我将展示一个代码案例,说明如何正确处理和序列化包含数组字段的请求参数对象。
问题背景
假设我们有一个请求参数对象 params
,其中包含一个数组字段 tags
,我们希望通过 uni.request
发送一个 POST 请求。
代码案例
1. 定义请求参数对象
let params = {
name: 'John Doe',
age: 30,
tags: ['JavaScript', 'React', 'Vue']
};
2. 使用 qs
库进行序列化(需要先安装 qs
)
由于 uni.request
默认使用 JSON.stringify
来序列化请求体,这可能导致数组字段不被正确处理。我们可以使用 qs
库来更好地序列化对象,特别是包含数组的情况。
首先,安装 qs
库(如果尚未安装):
npm install qs --save
然后,在代码中使用 qs
进行序列化:
import qs from 'qs';
uni.request({
url: 'https://example.com/api/user',
method: 'POST',
data: qs.stringify(params, { arrayFormat: 'brackets' }), // 使用qs序列化
header: {
'Content-Type': 'application/x-www-form-urlencoded' // 设置正确的Content-Type
},
success: (res) => {
console.log('Request succeeded:', res.data);
},
fail: (err) => {
console.error('Request failed:', err);
}
});
在上述代码中,qs.stringify
方法将 params
对象序列化为 URL 编码的查询字符串,其中数组字段 tags
被正确序列化为 tags[]=JavaScript&tags[]=React&tags[]=Vue
的形式。
3. 不使用 qs
库(简单情况)
如果请求参数结构比较简单,且后端可以接收 JSON 格式的数据,可以直接发送 JSON 数据,并设置正确的 Content-Type
:
uni.request({
url: 'https://example.com/api/user',
method: 'POST',
data: JSON.stringify(params),
header: {
'Content-Type': 'application/json'
},
success: (res) => {
console.log('Request succeeded:', res.data);
},
fail: (err) => {
console.error('Request failed:', err);
}
});
注意,这种方法要求后端服务器能够解析 JSON 格式的请求体。
通过以上方法,你应该能够解决 uni.request
中 POST 请求参数对象包含数组字段时的序列化问题。