curl请求一直等待但是postman访问正常的问题处理
问题说明:
研发开发的接口,使用postman 工具调用时正常响应。但是使用curl时会一直等待接口响应。
curl命令如下:
curl -X POST "http://localhost:8000/api/apiTest" \
-H "xRequestId: 5e4787a69959450f8d3f537ab1f7c149" \
-H "xTimestamp: 1752562369002" \
-H "nodeId: 91110108589104040B" \
-H "Content-Type: application/json;charset=utf-8" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0" \
-H "Content-Length: 368" \
-d '{"signature":"L+4L8AUdjnfEmsBAu18VhvnNXzbnf3TzNbrJ+uqJPo9K8eC84XB5aeTLjh4tCLTC1mmBIdE1KtTj37/j6guryUlothpwpaSpRT8IyT2RbWtHspAee3jhKV+8+Jpa9MQDAJoNAObw1aHyhLELrU7jEWwZTK4qC1xd7fpNRg8P73uNmqlIEMx/uYuOxsvICx3BGWJtjScUYEEdnDUgPmT07jdY8ZWOp/lKlFKA86hucxZKIg1sThdELiGJE4HYd1+ThQBfxrO/6HNQ78yxXHYLld7uHc1QYXS+vFy4RCC37Lhcrs2BNv0uVEniVVrWQufbafiKHnX7mfFwQnG3p7toxw=="}'
postman 请求:
问题分析:
- 通过排查后端以及中间链路都是正常的。
- 对curl命令进行详细对比分析。删除请求头测试,发现当删除
-H "Content-Length: 368"
这个请求头时,后端会正常响应。
问题说明:
手动设置 Content-Length
但未提供大小匹配的请求体数据会导致请求卡死。原因在于 HTTP 协议的底层工作原理:
Content-Length
是承诺,当您在请求头中声明 Content-Length: 368
,即向服务器承诺:
“我将发送 368 字节的数据,请准备好接收”
curl 的行为逻辑
- 当您设置了
Content-Length
但通过-d
提供数据不满足对应字节长度时时:
curl 会:- 建立 TCP 连接
- 发送请求头(包含
Content-Length: 368
) - 等待输入 368 字节数据
- 服务器端行为:
- 收到请求头后,分配 368 字节缓冲区
- 持续等待剩余数据直到收到 368 字节
- 如果超时未收全,关闭连接(表现为"无响应")
为什么删除后正常?
当删除手动设置的 Content-Length
头,这时 curl 会自动:
- 计算字节长度
- 自动添加正确的请求头:
- 立即发送完整请求(头+体)
为什么postman正常
是因为postman工具调用的时候是自动计算大小的。所以正常。如下图所示:
问题解决:
先计算数据长度,确保-d提供等长数据。修改Content-Length
的值与实际传输的数据大小一致。
关键结论:HTTP 协议要求头部的 Content-Length
必须与实际传输的字节数精确匹配。手动设置该值而不提供匹配数据,会导致协议层面的死锁状态。