uni-app uni.request post 请求参数对象有字段是数组,序列化有问题

发布于 1周前 作者 h691938207 来自 Uni-App

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

5 回复

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 请求参数对象包含数组字段时的序列化问题。

回到顶部