You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OkHttp RequestBody数组参数构建问题:仅能添加单条课程信息

循环添加RequestBody数组参数时被覆盖?原因和解决方案

问题原因

你遇到的核心问题是**put方法的特性导致值被反复覆盖**:假设你的requestBody是普通Map(比如HashMap),每次调用put("fees[]", ...)时,都会用当前循环的新值替换掉同一个key对应的旧值。循环结束后,每个key(如fees[]、course_id[])最终只会保留最后一次循环传入的值,自然无法形成包含多条数据的数组。

简单说:你不是在往数组里追加元素,而是反复替换同一个key的唯一值。

解决方案

根据requestBody的类型,有两种常用的解决方式:

方式一:先收集列表,再一次性存入Map

如果requestBody是普通Map,你需要先为每个字段创建列表,把所有循环数据存入列表后,再将整个列表作为值存入Map:

// 1. 初始化各个字段的列表
List<String> feesList = new ArrayList<>();
List<String> courseIdList = new ArrayList<>();
List<String> durationList = new ArrayList<>();
List<String> courseStatusList = new ArrayList<>();
List<String> certificateList = new ArrayList<>();
List<String> bookMaterialList = new ArrayList<>();
List<String> bagList = new ArrayList<>();

// 2. 循环收集数据(用增强for循环更简洁)
for (StudentCourseData data : listStudentCourseData) {
    feesList.add(data.getStrFees());
    courseIdList.add(data.getStrCourseId());
    durationList.add(data.getStrDuration());
    courseStatusList.add(data.getStrCourseStatus());
    certificateList.add(data.getStrCertificate());
    bookMaterialList.add(data.getStrBookMaterial());
    bagList.add(data.getStrBag());
}

// 3. 将列表存入requestBody
requestBody.put("fees[]", feesList);
requestBody.put("course_id[]", courseIdList);
requestBody.put("duration[]", durationList);
requestBody.put("course_status[]", courseStatusList);
requestBody.put("certificate[]", certificateList);
requestBody.put("book_material[]", bookMaterialList);
requestBody.put("bag[]", bagList);

这种方式下,每个key对应完整列表,后端框架(如Spring)通常会自动识别并解析为数组参数。

方式二:使用支持多值的Map(如MultiValueMap)

如果你的项目用了Spring等框架,可以用MultiValueMap替代普通Map。它的add方法会自动将值追加到对应key的列表中,而非覆盖:

// 初始化支持多值的Map
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();

// 循环添加数据,用add替代put
for (StudentCourseData data : listStudentCourseData) {
    requestBody.add("fees[]", data.getStrFees());
    requestBody.add("course_id[]", data.getStrCourseId());
    requestBody.add("duration[]", data.getStrDuration());
    requestBody.add("course_status[]", data.getStrCourseStatus());
    requestBody.add("certificate[]", data.getStrCertificate());
    requestBody.add("book_material[]", data.getStrBookMaterial());
    requestBody.add("bag[]", data.getStrBag());
}

这种方式无需提前初始化列表,add方法会自动维护每个key对应的多值集合,代码更简洁。

补充说明

后端接口参数需对应数组或列表类型(比如@RequestParam("fees[]") String[] fees或List<String> fees),才能正确解析你传入的多值数组参数。

内容的提问来源于stack exchange,提问作者Jaimin Modi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:08