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
相关产品推荐
相关产品推荐

