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

Flutter发送Multipart POST请求时表单数组重复键被覆盖怎么解决

问题根因

Dart 内的Map类型默认不允许重复键,你调用request.fields.addAll()传入的Map包含两个相同的fields[0][value][]键,后写入的键值对会直接覆盖前者,最终请求只会携带最后一个Web Developer值,因此后端仅能识别到最后一个参数。

解决方案

根据你的请求场景,可以选择以下两种方案:

方案1:使用官方http包,以x-www-form-urlencoded格式发送请求

如果你的请求不需要上传文件,直接用该方案即可,无需引入额外依赖。http包的POST方法支持直接传入List<MapEntry>类型的body,不会对重复键做去重处理,完全符合你的传参要求:

import 'package:http/http.dart' as http;

var headers = {
  'Authorization': '...',
  'Cookie': '...'
};

final response = await http.post(
  Uri.parse('my_endpoint'),
  headers: headers,
  // 直接传入MapEntry列表,支持重复键
  body: [
    const MapEntry('fields[0][field_id]', '20'),
    const MapEntry('fields[0][group_id]', '1'),
    const MapEntry('fields[0][value][]', 'Android Developer'),
    const MapEntry('fields[0][value][]', 'Web Developer'),
  ],
);

if (response.statusCode == 200) {
  print(response.body);
} else {
  print(response.reasonPhrase);
}

方案2:使用dio包发送multipart/form-data请求

如果你的请求需要附带上传文件,必须使用multipart格式,可以换用dio包实现,dio的FormData原生支持添加重复键的表单字段:

import 'package:dio/dio.dart';

var headers = {
  'Authorization': '...',
  'Cookie': '...'
};

final formData = FormData();
formData.fields.add(const MapEntry('fields[0][field_id]', '20'));
formData.fields.add(const MapEntry('fields[0][group_id]', '1'));
// 重复添加同键名字段不会被覆盖
formData.fields.add(const MapEntry('fields[0][value][]', 'Android Developer'));
formData.fields.add(const MapEntry('fields[0][value][]', 'Web Developer'));

// 如有文件上传需求可以在这里添加
// formData.files.add(MapEntry('upload_file', await MultipartFile.fromFile('/path/to/file')));

final dio = Dio();
final response = await dio.post(
  'my_endpoint',
  options: Options(headers: headers),
  data: formData,
);

if (response.statusCode == 200) {
  print(response.data);
} else {
  print(response.statusMessage);
}

内容的提问来源于stack exchange,提问作者Ahmed Nabil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:39:04