C++ libcurl Post请求报CURLE_BAD_FUNCTION_ARGUMENT错误解决
libcurl POST请求返回CURLE_BAD_FUNCTION_ARGUMENT错误解决方案
问题场景
在C++项目中基于libcurl开发网络功能时,执行POST请求后拿到的CURLcode返回值为CURLE_BAD_FUNCTION_ARGUMENT,调整已配置的curl选项后问题仍存在。
可正常运行的实现代码
问题已排查修复,以下是经过验证的可用封装实现:
namespace networking { CURL* curl = nullptr; std::string response_buffer; static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } void Setup() { curl = curl_easy_init(); if (curl == NULL) { return; } struct curl_slist* headerlist = NULL; headerlist = curl_slist_append(headerlist, "Accept:application/json"); headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded"); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response_buffer); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); } bool PostXML(std::string url, std::string data, json& output) { printf("%s\n", data.c_str()); response_buffer.clear(); CURLcode res; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); curl_easy_setopt(curl, CURLOPT_POST, 1); res = curl_easy_perform(curl); if (res != CURLE_OK) { return false; } output = json::parse(response_buffer); return true; } void CleanUp() { curl_easy_cleanup(curl); curl = nullptr; } }
常见踩坑点
这类参数错误基本都是配置顺序、参数有效性问题导致,排查时优先核对以下项:
- 必须先调用
curl_easy_init()获取有效CURL句柄,且判断句柄非空后再执行后续配置、请求操作,空句柄下所有curl接口调用都会触发参数错误 - 配置写回调
CURLOPT_WRITEFUNCTION时,必须同步通过CURLOPT_WRITEDATA传入匹配类型的用户数据指针,避免回调执行时访问非法地址 - POST请求必须同时配置三个核心项:
CURLOPT_URL传入合法非空的请求地址、CURLOPT_POST设为1开启POST模式、CURLOPT_POSTFIELDS传入非空的请求体数据 - 自定义请求头的
curl_slist链表必须保证在curl_easy_perform执行完成前不被释放,否则libcurl读取头配置时会拿到非法指针 - 所有传给
curl_easy_setopt的字符串参数,要保证在curl持有该指针期间内存不被释放,避免悬空指针问题
内容的提问来源于stack exchange,提问作者user12548552
相关产品推荐
相关产品推荐

