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

相关推荐
Moshow郑锴21 小时前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
Wang's Blog1 天前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
\光辉岁月/1 天前
5.java-数组
java·开发语言
谢亮_vipxieliang1 天前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
郑州光合科技余经理1 天前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071571 天前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat1 天前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源1 天前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog1 天前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
HEJOO91 天前
指针的算术运算详解
java·数据结构·算法