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

如何在Visual C++中使用libcurl复刻命令行curl的POST请求

问题修复方案

核心错误:句柄混用

你的代码中存在明显的句柄调用错误:

  • 你初始化得到的用来执行请求的句柄是局部变量handle
  • 但设置CURLOPT_WRITEFUNCTION、CURLOPT_WRITEDATA时,错误传入了类成员变量this->handle
    这就导致你真正用来执行curl_easy_perform的局部handle,配置是不完整的,两个不同句柄的配置完全隔离,也就出现了POST参数没有生效、返回结果和GET请求一致的问题。

其他需要补充/修正的点

  • 显式设置CURLOPT_POST为1L,强制指定请求为POST方法。虽然CURLOPT_POSTFIELDS会隐式触发POST方法配置,但部分场景下(比如句柄复用、libcurl版本差异)可能失效,显式配置更稳妥。
  • 可选添加CURLOPT_FOLLOWLOCATION为1L,如果服务端存在POST重定向逻辑,避免重定向后请求自动切换为GET导致POST参数丢失。
  • 修正语法错误:你设置CURLOPT_WRITEDATA的代码行末尾缺少分号。
  • 补充句柄释放逻辑:请求执行完成后需要调用curl_easy_cleanup释放句柄,避免内存泄漏。

修正后的核心代码示例

static size_t WriteCallBack( void *contents, size_t size, size_t nmemb, void *userp ) noexcept {     
  size_t nbytes = size * nmemb;
  ((std::string*)userp)->append( (char*)contents, nbytes );
  return nbytes;
}

void ReadWebData() {
  CURLcode res;
  std::string bufr;

  CURL *handle = curl_easy_init();
  if(!handle) {
    // 句柄初始化失败处理逻辑
    return;
  }
  curl_easy_setopt(handle, CURLOPT_URL, "https://stockmarketmba.com/stockscreener.php");
  // 显式指定POST请求
  curl_easy_setopt(handle, CURLOPT_POST, 1L);
  
  char const *postfields = "assetclass=1&viewall=1&action=Go";
  curl_easy_setopt(handle, CURLOPT_POSTFIELDS, postfields);
  curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, (long)strlen(postfields));

  // 统一用局部初始化的handle设置回调,不要用this->handle
  curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, WriteCallBack);
  curl_easy_setopt(handle, CURLOPT_WRITEDATA, &bufr);
  // 可选开启重定向跟随
  curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);

  res = curl_easy_perform(handle);
  if (res == CURLE_OK) {
    // process data in bufr here
  }
  // 释放句柄
  curl_easy_cleanup(handle);
}

内容的提问来源于stack exchange,提问作者Bill Pierce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:04