curl请求一直等待但是postman访问正常的问题处理

发布于:2025-07-17 ⋅ 阅读:(24) ⋅ 点赞:(0)

问题说明:

研发开发的接口,使用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 请求:
在这里插入图片描述

问题分析:

  1. 通过排查后端以及中间链路都是正常的。
  2. 对curl命令进行详细对比分析。删除请求头测试,发现当删除-H "Content-Length: 368" 这个请求头时,后端会正常响应。

问题说明:

手动设置 Content-Length 但未提供大小匹配的请求体数据会导致请求卡死。原因在于 HTTP 协议的底层工作原理:
Content-Length 是承诺,当您在请求头中声明 Content-Length: 368,即向服务器承诺:

“我将发送 368 字节的数据,请准备好接收”

curl 的行为逻辑

  • 当您设置了 Content-Length通过 -d 提供数据不满足对应字节长度时时:
    curl 会:
    1. 建立 TCP 连接
    2. 发送请求头(包含 Content-Length: 368
    3. 等待输入 368 字节数据
  • 服务器端行为:
    1. 收到请求头后,分配 368 字节缓冲区
    2. 持续等待剩余数据直到收到 368 字节
    3. 如果超时未收全,关闭连接(表现为"无响应")

为什么删除后正常?

当删除手动设置的 Content-Length 头,这时 curl 会自动:

  1. 计算字节长度
  2. 自动添加正确的请求头:
  3. 立即发送完整请求(头+体)

为什么postman正常

是因为postman工具调用的时候是自动计算大小的。所以正常。如下图所示:
在这里插入图片描述

问题解决:

先计算数据长度,确保-d提供等长数据。修改Content-Length的值与实际传输的数据大小一致。

关键结论:HTTP 协议要求头部的 Content-Length 必须与实际传输的字节数精确匹配。手动设置该值而不提供匹配数据,会导致协议层面的死锁状态。


网站公告

今日签到

点亮在社区的每一天
去签到