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 内容以及中间件的注册顺序。
备注:内容仅供参考。
