PostMan:400 Bad Request‌

在 Postman 中调用接口返回 ‌400 Bad Request‌,且怀疑与 ‌JSON 键名大写‌有关时,通常是因为‌客户端发送的 JSON 字段名与后端期望的字段名不一致‌。

  1. 原因分析

HTTP 400 错误表示"请求语法错误或参数无效"。当涉及 JSON 键名大小写时,主要原因包括:

后端严格匹配字段名‌:大多数后端框架(如 Java Spring Boot、Go、Python Pydantic 等)默认对 JSON 键名是‌大小写敏感‌的。

例如:后端期望 "userId",但 Postman 发送了 "USERID" 或 "userid",后端可能无法识别该字段,导致必填项缺失或校验失败,从而返回 400。

序列化/反序列化配置差异‌:

如果后端使用了特定的命名策略(如驼峰转下划线 user_id),而前端直接发送了大写字段,会导致映射失败。

某些旧系统或特定 API 可能要求全大写键名(较少见,但存在),若发送了小写则报错。

JSON 格式本身错误‌:虽然较少见,但如果手动拼接 JSON 时因大小写转换逻辑错误导致引号缺失或结构破坏,也会引发 400。

  1. 排查步骤

第一步:确认后端期望的字段名

查看 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。

  1. 解决方案

方案 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");

}

}

注意:此方法仅适用于后端允许小写键名的情况,务必先确认后端规范。

  1. 常见误区提醒

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 键名与后端定义‌完全一致‌(包括大小写)。

相关推荐
devpotato1 小时前
RPO与RTO:容灾的两个关键指标
java·后端
宁渡AI大模型1 小时前
AI 全栈面试新趋势:Vibe Coding、前端、Java 后端高频面试题深度解析|河南宁渡科技有限公司编程教程
java·javascript·人工智能·python·ai大模型
CallFay云起未来2 小时前
AI客服如何与人工客服协同?从任务路由到上下文交接的Agent架构实践
java·人工智能·文心一言
cfm_29142 小时前
观察者模式
java
野生技术架构师2 小时前
1000+ Java面试题知识图谱:从基础语法到分布式架构的完整拓扑
java·面试
步行cgn2 小时前
Spring 底层如何创建对象:反射机制与实例化策略
java·后端·spring
何以解忧,唯有..2 小时前
Redis 过期事件监听:原理与实战
java
风中的小熊生气3 小时前
Spring Boot 面试知识(二):分层、IoC、异常、配置与 Redis
java·springboot
泡茶喝茶写代码3 小时前
量化数据开发实战系列(第 25 篇):基金基础接口实战:基金列表、ETF-LOF 分类、基金概况、净值数据
java·数据库·人工智能·python·mysql