在 Postman 中调用接口返回 400 Bad Request,且怀疑与 JSON 键名大写有关时,通常是因为客户端发送的 JSON 字段名与后端期望的字段名不一致。
- 原因分析
HTTP 400 错误表示"请求语法错误或参数无效"。当涉及 JSON 键名大小写时,主要原因包括:
后端严格匹配字段名:大多数后端框架(如 Java Spring Boot、Go、Python Pydantic 等)默认对 JSON 键名是大小写敏感的。
例如:后端期望 "userId",但 Postman 发送了 "USERID" 或 "userid",后端可能无法识别该字段,导致必填项缺失或校验失败,从而返回 400。
序列化/反序列化配置差异:
如果后端使用了特定的命名策略(如驼峰转下划线 user_id),而前端直接发送了大写字段,会导致映射失败。
某些旧系统或特定 API 可能要求全大写键名(较少见,但存在),若发送了小写则报错。
JSON 格式本身错误:虽然较少见,但如果手动拼接 JSON 时因大小写转换逻辑错误导致引号缺失或结构破坏,也会引发 400。
- 排查步骤
第一步:确认后端期望的字段名
查看 API 文档:确认接口文档中定义的字段名是驼峰式(userName)、下划线式(user_name)还是全大写(USER_NAME)。
检查后端代码:
Java (Jackson):检查实体类上的 @JsonProperty("fieldName") 注解。如果没有注解,默认使用字段名(通常是小写开头驼峰)。
Java (Gson):检查是否配置了 FieldNamingPolicy。
其他语言:确认反序列化库的默认行为。
第二步:检查 Postman 请求体
打开 Postman,进入 Body 标签页。
选择 raw 和 JSON 格式。
仔细核对键名:
❌ 错误示例:{ "USERID": 123, "NAME": "Test" } (如果后端期望 userId 和 name)
✅ 正确示例:{ "userId": 123, "name": "Test" }
注意嵌套对象:确保嵌套层级中的键名也符合大小写规范。
第三步:查看后端返回的具体错误信息
400 错误的响应体(Response Body)通常包含具体的校验错误信息。
Spring Boot 示例:
json
{
"timestamp": "2026-09-15T10:00:00",
"status": 400,
"errors": [
{
"field": "userId",
"rejectedValue": null,
"message": "必须不为空"
}
]
}
如果看到 field: "userId" 且 rejectedValue: null,说明后端没收到 userId,很可能是因为你在 Postman 里写成了 USERID。
- 解决方案
方案 A:修正 Postman 中的 JSON 键名(推荐)
直接将 Postman Body 中的键名修改为与后端定义完全一致的形式。
如果后端期望驼峰:{"userName": "Alice"}
如果后端期望下划线:{"user_name": "Alice"}
方案 B:后端兼容处理(如需支持多种格式)
如果希望后端能同时接受大写、小写或混合大小写的键名,可以在后端进行配置:
Java Jackson 配置:
在实体类上使用 @JsonProperty 明确指定,或配置 ObjectMapper 忽略大小写(不推荐,性能且有歧义风险):
java
@JsonProperty("userId") // 明确指定序列化和反序列化使用的名称
private Long userId;
或者启用 ACCEPT_CASE_INSENSITIVE_PROPERTIES 特性(需谨慎使用):
java
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
Python Pydantic:
使用 alias 或配置 model_config 来映射不同大小的字段。
方案 C:使用 Pre-request Script 自动转换(高级技巧)
如果接口众多且键名规则统一(如全部转为小写),可以在 Postman 的 Pre-request Script 中编写脚本自动转换 Body 中的键名:
javascript
// 示例:将 Body 中的所有键名转换为小写
if (pm.request.body && pm.request.body.mode === 'raw') {
try {
let bodyObj = JSON.parse(pm.request.body.raw);
// 递归转换键名为小写的函数
function convertKeysToLowercase(obj) {
if (typeof obj !== 'object' || obj === null) return obj;
if (Array.isArray(obj)) return obj.map(convertKeysToLowercase);
return Object.keys(obj).reduce((acc, key) => {
acckey.toLowerCase() = convertKeysToLowercase(objkey);
return acc;
}, {});
}
let newBody = JSON.stringify(convertKeysToLowercase(bodyObj));
pm.request.body.raw = newBody;
} catch (e) {
console.error("JSON parse error in pre-request script");
}
}
注意:此方法仅适用于后端允许小写键名的情况,务必先确认后端规范。
- 常见误区提醒
Content-Type 必须正确:确保 Postman 的 Header 中 Content-Type 为 application/json。如果误设为 text/plain,后端可能无法解析 JSON,直接报 400。
不要手动拼接 JSON:尽量使用 Postman 的 JSON 编辑器或从代码复制标准 JSON,避免因为大小写转换工具引入不可见字符或语法错误(如尾随逗号)。
区分 400 和 404/401:
400 是"你发的数据我看不懂或不符合格式"。
401 是"你没登录"。
404 是"地址错了"。
如果键名大写导致后端找不到字段而抛出异常,通常是 400;如果是权限问题,则是 401/403。
总结
Postman 报 400 且怀疑键名大写问题时,90% 的情况是因为发送的键名(如 USERID)与后端期望的键名(如 userId)不匹配。请优先检查 API 文档或后端代码,确保 Postman Body 中的 JSON 键名与后端定义完全一致(包括大小写)。