1. 问题现象与初步排查
最近在跨平台开发中遇到一个棘手的网络请求问题:同一份使用libcurl库的POST请求代码,在Ubuntu系统上运行完全正常,但在Windows平台却总是失败。具体表现为curl_easy_perform()函数返回错误码52,通过curl_easy_strerror(52)获取的错误描述是"Server returned nothing (no headers, no data)"。
这个错误表面看起来像是服务器完全没有响应,但奇怪的是:
- 相同的请求在Linux环境下能正常获得响应
- 直接使用Postman等工具测试API接口也工作正常
- 网络抓包显示请求确实到达了服务器
提示:当遇到跨平台行为不一致的问题时,第一步应该用Wireshark或Fiddler等工具抓取网络包,对比两个平台实际发出的HTTP请求有何差异。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题根源分析
通过对比Windows和Linux下的网络抓包数据,发现关键差异在于Windows平台自动添加了一个特殊的请求头:
code复制Expect: 100-continue
这个头部字段是HTTP/1.1协议的一个特性,其工作机制如下:
2.1 HTTP 100 Continue机制解析
- 设计初衷:当客户端需要发送较大请求体时,先通过这个头部与服务器"握手"
- 工作流程:
- 客户端发送带
Expect: 100-continue的请求头 - 服务器如果愿意接收大请求体,返回
100 Continue临时响应 - 客户端收到100响应后,继续发送请求体
- 客户端发送带
- 优势:避免直接发送大请求体后被拒绝造成的带宽浪费
2.2 libcurl的跨平台差异
问题出在libcurl的Windows实现上:
- Linux版本默认不添加Expect头
- Windows版本自动添加了Expect头
- 但目标服务器没有正确实现100-continue协议:
- 收到Expect头后既不返回100 Continue
- 也不返回最终响应
- 导致客户端一直等待响应而超时
3. 解决方案与代码实现
3.1 禁用Expect头的最简方案
在curl请求设置中添加以下代码即可
