我正在尝试使用libcurl c api从某个基于Web的api获取一些数据。
Curl调用api很好。但是,size_t nmemb太小,无法保存响应。它以某种方式在1280年被“切断”。有人知道如何解决此问题吗? size_t size也是1.。

这些是我使用的功能:

int http_call(char *url) {

    CURL *curl;
    FILE *curlfile;
    CURLcode res;

    char outfilename[FILENAME_MAX] = "/usr/local/var/log/ndcurl";
    curl = curl_easy_init();
    if (curl) {

        curlfile = fopen(outfilename,"w");
        curl_easy_setopt(curl, CURLOPT_URL, url);

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_release_data);

        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);
        fclose(curlfile);

    }

    return 0;

}


和回调:

static size_t write_release_data(void *buffer, size_t size, size_t nmemb, void *userp) {

    char **response_ptr =  (char**)userp;
    *response_ptr = strndup(buffer, (size_t)(size *nmemb));
    printf("The Response: %s", *response_ptr);

    return 0;

}

最佳答案

您需要修复回调以返回实际写入的字节数。来自the documentation


  将指针传递给与以下原型匹配的函数:
  size_t function( char *ptr, size_t size, size_t nmemb, void *userdata);一旦收到需要保存的数据,libcurl就会立即调用此函数。指向的数据大小
  ptr乘以size乘以nmemb,则不会被零终止。
  返回实际处理的字节数。如果那个数量
  与传递给您的函数的数量不同,它将发出错误信号
  去图书馆。这将中止转移并返回
  CURLE_WRITE_ERROR


如果返回size * nmemb,libcurl应该在其余的响应中再次调用函数。

08-04 21:46