CURL下载ASX CSV数据与浏览器直接下载结果不一致问题排查
问题原因及解决方案
- 核心错误:你配置完CURL参数后没有调用
curl_easy_perform(m_MyHandle)执行实际网络请求,直接打印了还未赋值的空字符串,甚至可能读取到内存脏数据,这是内容不一致的最主要原因。 - 次要问题:该接口默认返回gzip压缩的响应内容,如果没有开启CURL自动解压功能,拿到的压缩二进制内容被当成纯文本解析也会出现乱码。
- 优化点:原代码没有做请求错误判断,也没有释放CURL相关资源,存在内存泄漏风险。
修复后的完整可运行代码如下:
#include <string> #include <cstdio> #include "curl/curl.h" size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } int main() { CURL* m_MyHandle; CURLcode m_Result; curl_global_init(CURL_GLOBAL_ALL); m_MyHandle = curl_easy_init(); if(m_MyHandle) { // 配置和Chrome一致的UA,避免服务端返回差异化内容 curl_easy_setopt(m_MyHandle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); curl_easy_setopt(m_MyHandle, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(m_MyHandle, CURLOPT_URL, "https://asx.api.markitdigital.com/asx-research/1.0/companies/directory/file?access_token=83ff96335c2d45a094df02a206a39ff4"); // 开启自动解压压缩响应,和浏览器行为对齐 curl_easy_setopt(m_MyHandle, CURLOPT_ACCEPT_ENCODING, "gzip, deflate, br"); std::string codeNamesBuff; curl_easy_setopt(m_MyHandle, CURLOPT_WRITEDATA, &codeNamesBuff); // 执行实际网络请求,这是原代码遗漏的关键步骤 m_Result = curl_easy_perform(m_MyHandle); if(m_Result == CURLE_OK) { printf("%s", codeNamesBuff.c_str()); } else { fprintf(stderr, "请求失败: %s\n", curl_easy_strerror(m_Result)); } // 释放资源 curl_easy_cleanup(m_MyHandle); } curl_global_cleanup(); return 0; }
运行修复后的代码,输出内容和浏览器下载的CSV完全一致,第5、6行代码为1ST和29M,不会再出现内容异常问题。
内容的提问来源于stack exchange,提问作者asjhdbashjdbasjhdbhjb
相关产品推荐
相关产品推荐

