You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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」时:

  1. 预请求脚本先执行:成功发送3次POST请求,把3个用户存入数据库;
  2. 紧接着Postman发送你当前打开的这个主请求——但这个主请求没有携带任何请求体,所以SpringBoot抛出Required request body is missing,返回400状态码。

这就是为什么你看到400,但用户却已经成功创建的核心原因!

解决办法

  • 如果你只是想批量创建用户,不需要主请求:可以把这个主请求改成GET请求(比如指向/library/users用来查询创建后的用户),或者直接在Postman控制台里执行脚本(打开控制台,粘贴脚本后回车);
  • 如果你确实需要发送主请求:给这个主请求也填写合法的JSON请求体,确保它符合后端的参数要求。

再检查预请求脚本的细节(排除脚本本身的问题)

虽然你说已经尝试过修改,但还是可以再确认以下几点,避免脚本里的请求出现问题:

  1. 请求头的键名要写复数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());
    }
});
  1. 确认请求体的序列化没问题
    你的脚本里用JSON.stringify(item)把每个用户对象转成JSON字符串,这部分是正确的,和后端User实体的字段(name、email、password)也完全匹配,所以这部分不会导致请求体缺失的问题。

验证方式:查看Postman控制台

打开Postman左下角的「Console」(控制台),你可以看到所有发送的请求:包括预请求脚本里的3个POST,以及你的主请求。查看每个请求的状态码和详情,就能明确是哪个请求返回了400——如果是主请求返回400,就对应上面第一个原因;如果是预请求里的某个请求,再针对性排查该请求的参数。

备注:内容来源于stack exchange,提问作者Neoly Moreno

火山引擎 最新活动