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

相关推荐
weixin_448771728 分钟前
Spring框架之ApplicationContext源码学习
java·学习·spring
白露与泡影16 分钟前
Spring AI Alibaba -- 文生图、文生音及向量化
java·人工智能·spring
滕州市燕猫虎计算机科技工作室个体工商户17 分钟前
Java,Java NIO,Java NIO2,Java AIO,AsynchronousServerSocketChannel
java·开发语言·nio·aio·nio2
学长毕设26 分钟前
基于springboot的社会志愿者管理系统-附源码
java·spring boot·后端
木头科技42 分钟前
【AI 工程化第十六篇】Spring AI 多模态 RAG 实战:图片、扫描件、表格与图文证据链
java·人工智能·spring
驭渊的小故事1 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
菜鸟小杰子1 小时前
手动修改 Spring Boot 嵌套 JAR 包:大包小包隔离打包实战
java·jar
计算机编程-吉哥1 小时前
计算机毕业设计 基于 SpringBoot + Vue 的剧本杀系统 Java毕业设计【任务书、开题报告、中期报告、论文、源码】
java·vue.js·spring boot·毕业设计·课程设计·计算机毕业设计选题
code2cat1 小时前
【随笔】RAG语义缓存:问题很相似,答案就能直接复用吗
java·缓存·知识库·rag
Rain的Java大神之路1 小时前
面了 50 个候选人,90% 都挂在 LeetCode 3 无重复字符的最长子串:滑动窗口的 5 个致命坑
java·后端·leetcode