PAYATHON 2026

curl 请求头冒号后的空格会导致 Express 无法解析 JSON 吗?

数据阿明

结论

Content-Type 冒号后的空格不会导致 Express 无法解析 JSON。问题在于 shell 命令中的 ${HEADER} 没有加引号,shell 会按空格拆分变量内容,curl 因此无法将完整的 Content-Type 值作为一个 -H 参数接收。

HTTP 请求头字段值的冒号后可以有空白。express.json() 会在请求体被识别为 JSON 时解析它。如果 curl 发出的 Content-Type 不匹配,request.body 可能无法得到解析结果。

修改 curl 命令

给变量展开加上双引号,其他变量也一并加上:

HEADER="Content-Type: application/json; charset=utf-8"
SERVER_LOCATION="http://localhost:3001/api/notes"
POST_FILE="@postJson.json"

RESPONSE=$(curl -H "$HEADER" -d "$POST_FILE" "$SERVER_LOCATION" | jq)
echo "$RESPONSE"

-d 会让 curl 使用 POST 请求,因此这里可以省略 -X POST。也可以改用 --data-binary:

curl -H "$HEADER" --data-binary "$POST_FILE" "$SERVER_LOCATION" | jq

为什么去掉空格后看起来正常

原命令是:

curl -H ${HEADER} -d ${POST_FILE} -X POST ${SERVER_LOCATION}

变量展开未加引号时,shell 会按空格分词。HEADER 中的空格会拆开变量内容,curl 收到的就不是一个完整的请求头参数。去掉空格后,变量内容不会被拆成多个字段,所以问题暂时消失。正确做法是给包含空格的变量加上引号。

检查请求体解析

确认 postJson.json 中是有效 JSON,且 curl 能读取该文件。Express 端应在路由处理之前注册解析中间件:

app.use(express.json());

app.post('/api/notes', (request, response) => {
  const body = request.body;
  // 处理 body
});

如果加引号后仍得到 body missing,可以检查 curl 实际发送的请求头和响应,并确认文件路径、JSON 内容以及中间件的注册顺序。

备注:内容仅供参考。