You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在libcurl中禁用Expect 100-continue?解决POST请求阻塞问题

解决libcurl中Expect: 100-continue导致的POST请求阻塞问题

我太懂这个糟心的问题了——当你用libcurl的CURLOPT_POST发HTTPS请求时,默认的Expect: 100-continue机制经常会在服务器不配合的时候搞出阻塞,就是你看到的那串提示。本质上是libcurl在发送大体积POST数据前,先给服务器发个Expect头,等服务器返回100 Continue信号才会发实际数据;要是服务器不支持这个机制、或者响应慢,就会卡在那等,直到超时。

下面给你两种靠谱的解决办法,按需选择:

方法一:直接禁用Expect头(兼容所有libcurl版本)

通过自定义HTTP请求头,把Expect设为空值,直接跳过100-continue的等待流程。代码示例(C语言):

// 初始化自定义头列表
struct curl_slist *custom_headers = NULL;
// 添加空的Expect头,覆盖默认值
custom_headers = curl_slist_append(custom_headers, "Expect:");
// 告诉libcurl使用这个自定义头列表
curl_easy_setopt(your_curl_handle, CURLOPT_HTTPHEADER, custom_headers);

// ... 执行你的请求逻辑 ...

// 请求结束后记得清理头列表,避免内存泄漏
curl_slist_free_all(custom_headers);

这个方法不管你用的是新还是旧版本的libcurl都管用,是最通用的方案。

方法二:设置100-continue超时(libcurl 7.36.0+可用)

如果你不想完全禁用这个机制,只是不想等太久,可以用CURLOPT_EXPECT_100_TIMEOUT_MS选项设置等待超时时间。比如设为0毫秒,libcurl就会直接发送POST数据,完全不等待服务器的100响应:

// 设置等待100-continue的超时为0,立即发送数据
curl_easy_setopt(your_curl_handle, CURLOPT_EXPECT_100_TIMEOUT_MS, 0L);

要是你想留一点等待时间,比如设为500毫秒,超过这个时间没收到响应就直接发数据也行,灵活度更高。

额外提醒

  • 如果你用的是非常老旧的libcurl版本(低于7.36.0),只能用方法一,因为方法二的选项是后来才加入的。
  • 用方法一时,要确保CURLOPT_HTTPHEADER的其他自定义头不会和这个Expect头冲突,避免出现奇怪的请求问题。

内容的提问来源于stack exchange,提问作者Mini Rai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:58:22