Postman预请求脚本发送POST请求返回400状态码但数据已存入数据库问题排查
Postman预请求脚本发送POST请求返回400状态码但数据已存入数据库问题排查
我完全懂你现在的困惑——明明数据库里已经成功创建了用户,Postman却返回400 Bad Request,还抛出Required request body is missing的异常,这确实有点矛盾。咱们一步步拆解问题,找到根源:
最可能的原因:主请求本身未携带请求体
你大概率是踩了Postman预请求脚本的一个常见坑:预请求脚本是在你当前点击「Send」的主请求之前执行的,但主请求本身也会被发送。
举个例子:你可能在Postman里新建了一个POST请求,目标URL是http://localhost:8080/library/users,但这个主请求的请求体是空的,然后你把批量创建用户的脚本放在了这个请求的「Pre-request Script」标签里。当你点击「Send」时:
- 预请求脚本先执行:成功发送3次POST请求,把3个用户存入数据库;
- 紧接着Postman发送你当前打开的这个主请求——但这个主请求没有携带任何请求体,所以SpringBoot抛出
Required request body is missing,返回400状态码。
这就是为什么你看到400,但用户却已经成功创建的核心原因!
解决办法
- 如果你只是想批量创建用户,不需要主请求:可以把这个主请求改成GET请求(比如指向
/library/users用来查询创建后的用户),或者直接在Postman控制台里执行脚本(打开控制台,粘贴脚本后回车); - 如果你确实需要发送主请求:给这个主请求也填写合法的JSON请求体,确保它符合后端的参数要求。
再检查预请求脚本的细节(排除脚本本身的问题)
虽然你说已经尝试过修改,但还是可以再确认以下几点,避免脚本里的请求出现问题:
- 请求头的键名要写复数
headers
Postman的pm.sendRequest配置里,请求头的正确键名是headers(不是header),规范写法如下:
pm.sendRequest({ url: "http://localhost:8080/library/users", method: "POST", headers: { "Content-Type": "application/json" }, // 注意是复数headers body: { mode: "raw", raw: JSON.stringify(item) } }, (err, res) => { if (err) { console.error("Error:", err); } else { console.log("Response:", res.json()); } });
- 确认请求体的序列化没问题
你的脚本里用JSON.stringify(item)把每个用户对象转成JSON字符串,这部分是正确的,和后端User实体的字段(name、email、password)也完全匹配,所以这部分不会导致请求体缺失的问题。
验证方式:查看Postman控制台
打开Postman左下角的「Console」(控制台),你可以看到所有发送的请求:包括预请求脚本里的3个POST,以及你的主请求。查看每个请求的状态码和详情,就能明确是哪个请求返回了400——如果是主请求返回400,就对应上面第一个原因;如果是预请求里的某个请求,再针对性排查该请求的参数。
备注:内容来源于stack exchange,提问作者Neoly Moreno




