libcurl使用需要注意的问题

今天遇到一个问题,libcurl进行post请求,发现回传的数据少了一部分,导致服务回传的json数据不完整。

bug修复前

inline size_t callBackFun_(void *buffer, size_t size, size_t nmemb, void *userp)
{
    static int current_index = 0;
    int content_size = nmemb * size; 
    std::string result = std::string((char *)buffer, content_size);
    LOG_DEBUG("------content_size---------" << content_size);
    LOG_INFO(result);
    return content_size;
}

void postImpl(){
    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curl = curl_easy_init();     
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callBackFun_);
} 

上面代码发现,post请求后频繁出现打印的log, json数据不完整, 导致解析失败。

bug修复后

std::string global_result};  // 注意这里

//下面回调 json太长 会进入多次
inline size_t callBackFun_(void *buffer, size_t size, size_t nmemb, void *userp)
{
    static int current_index = 0;
    int content_size = nmemb * size; 
    std::string result = std::string((char *)buffer, content_size);
    LOG_DEBUG("------content_size---------" << content_size);
    global_result.append(result);    
    return content_size;
}

void postImpl(){
    global_result.clear();
    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curl = curl_easy_init();     
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callBackFun_);
    LOG_INFO(global_result);
} 

以上是今天遇到的一个奇怪问题的解决方案。

推荐阅读更多精彩内容