Postman form-data 同名字段被覆盖是 HTTP 标准行为,非 Bug;Spring Boot 需用 @RequestParam List/String[] + name="key[]" 接收多值,缺方括号或类型不匹配则只取最后一个。

Postman form-data 传同名字段被覆盖的真相
Postman 的 form-data 模式下,若多个字段使用相同 name(如都叫 status),后端默认只收到最后一个值——这不是 Bug,是 HTTP 表单编码标准行为。浏览器和 Postman 都遵循 RFC 1867,对重复键名不做数组合并,除非后端显式按数组解析。
Spring Boot 中用 @RequestParam 接收多值必须加 [] 后缀
Spring Boot 默认把同名 form-data 字段当作单值处理。要接收多个同名值(比如多个 category_id),@RequestParam 参数类型必须是集合或数组,且前端 name 必须带方括号:
- Postman 中添加多个
key均为category_id[],每个value是一个字符串值(非 File) - 后端写法必须是:
@RequestParam List或category_id @RequestParam String[] category_id - 如果写成
@RequestParam String category_id,哪怕 Postman 发了三个category_id[],也只取最后一个 - 注意:方括号
[]是约定写法,Spring 不校验语法,但缺了它就不触发多值解析逻辑
PHP/Python/Node.js 等后端的等效处理差异
不同语言对同名表单字段的默认行为不一致,容易误判“是 Postman 问题”:
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- PHP:
$_POST['category_id']直接是数组——前提是 HTML 中原始name="category_id[]";若 Postman 手动填category_id(无括号),PHP 也只收最后一个 - Python Flask:
request.form.getlist('category_id')才能取全部;request.form['category_id']仍只返回末值 - Node.js Express(未配中间件):
req.body.category_id默认是字符串;需用express.urlencoded({ extended: true })并配合name="category_id[]"才得数组
文件数组和普通字段数组不能混用同一个 name
Postman 中如果同时上传文件和文本字段,且都用 files[] 这种 name,后端会出错或丢数据:
- 文件字段必须用
type=File,文本字段必须用type=Text,即使 name 相同(如都叫files[]),Postman 也会分开编码 - 但 Spring Boot 的
@RequestParam MultipartFile[] files只认 File 类型字段;同名 Text 字段会被忽略或报类型转换异常 - 安全做法:文件用
files,普通数组用tags[]、roles[]等语义化 name,彻底隔离
最容易被忽略的是:Postman 的 form-data 编码不自动识别“数组意图”,一切依赖 name 后缀 + 后端解析策略匹配。少一个 [],或多传一个没声明类型的同名字段,就只剩最后一个值。










