如何在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
相关产品推荐
相关产品推荐

