2010-04-05 113 views
14

我目前使用这个C代码:cURL - 把输出放到变量中?

CURL *curl; 
CURLcode res; 

curl = curl_easy_init(); 
if (curl) { 
    curl_easy_setopt(curl, CURLOPT_URL, "http://my-domain.org/"); 
    res = curl_easy_perform(curl); 

    curl_easy_cleanup(curl); 
} 

它在控制台上打印输出。我怎样才能得到相同的输出,但将它读入字符串? (这可能是一个基本的问题,但我还不了解libcurl API ...)

感谢您的帮助!

迈克

回答

16

你需要传递函数和缓冲来写缓冲。

/* setting a callback function to return the data */ 
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback_func); 

/* passing the pointer to the response as the callback parameter */ 
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &response); 


/* the function to invoke as the data recieved */ 
size_t static write_callback_func(void *buffer, 
         size_t size, 
         size_t nmemb, 
         void *userp) 
{ 
    char **response_ptr = (char**)userp; 

    /* assuming the response is a string */ 
    *response_ptr = strndup(buffer, (size_t)(size *nmemb)); 

} 

请看看更多信息here

+0

@Mike,一些例如更新和链接C和PHP,基本相同的概念。 – YOU 2010-04-05 09:33:00

+0

@ S.Mark,很酷,很好的链接! – Mike 2010-04-05 09:53:58

+0

不错!简洁,也:) – KeatsKelleher 2010-12-16 14:46:57

4

你需要一个写回调函数。我用这种功能来读取响应,错误和能够提供自己的头:

size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    std::string buf = std::string(static_cast<char *>(ptr), size * nmemb); 
    std::stringstream *response = static_cast<std::stringstream *>(stream); 
    response->write(buf.c_str(), (std::streamsize)buf.size()); 
    return size * nmemb; 
} 

bool CurlGet(
    const std::string &url, 
    const std::vector<std::string> &headers, 
    std::stringstream &response, 
    std::string &error) 
{ 

    curl_global_init(CURL_GLOBAL_ALL); 

    curl_slist *headerlist = NULL; 

    std::vector<std::string>::const_iterator it; 
    for (it = headers.begin(); it < headers.end(); it++) { 
     headerlist = curl_slist_append(headerlist, it->c_str()); 
    } 

    CURL *curl = curl_easy_init(); 
    char ebuf[CURL_ERROR_SIZE]; 
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); 
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, ebuf); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); 
    CURLcode res = curl_easy_perform(curl); 
    curl_easy_cleanup(curl); 
    curl_slist_free_all(headerlist); 

    if (res != CURLE_OK) 
     error = ebuf; 
    else 
     error.clear(); 

    return res == CURLE_OK; 
} 
2

这可以通过使用

curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, write_data); 

它设置一个回调函数write_data这是一个函数来完成与签名

size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp); 

如果你想userp是你正在使用你的程序的一些内部结构,调用

curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &internal_struct); 

将指针指向internal_struct传递给每个呼叫write_data

1

您好,我解决了从回调函数返回代码23从回调函数返回大小的问题。

看到下面的代码:

/* setting a callback function to return the data */ 
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback_func); 

/* passing the pointer to the response as the callback parameter */ 
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &response); 


/* the function to invoke as the data recieved */ 
size_t static write_callback_func(void *buffer, 
         size_t size, 
         size_t nmemb, 
         void *userp) 
{ 
    char **response_ptr = (char**)userp; 

    /* assuming the response is a string */ 
    *response_ptr = strndup(buffer, (size_t)(size *nmemb)); 

    return ((size_t)(size *nmemb)); 
//if you not send return value of size it will show you ERROR CODE 23return curl_easy_perform(); 

} 
+0

您能详细解释一下您提供的解决方案吗? – abarisone 2015-03-27 09:39:45

0

的其他例子没有为我工作。
这里是我最终落得这样做:

size_t static curl_write(void *buffer, size_t size, size_t nmemb, void *userp) 
{ 
    userp += strlen(userp); // Skipping to first unpopulated char 
    memcpy(userp, buffer, nmemb); // Populating it. 
    return nmemb; 
} 

int GetCurl() 
{ 
    CURL *curl; 
    CURLcode res; 

    char *s = (char *) malloc(512); 

    curl = curl_easy_init(); 
    if (curl) 
    { 
      curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com"); 
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write); 
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, s); 
      res = curl_easy_perform(curl); 
      curl_easy_cleanup(curl); 
    } 

    printf("GREAT SUCCESS!! Your string is %s\n", s); 
} 
+0

为什么“void * userp”? – schaiba 2017-08-30 11:16:58

+0

@schaiba - 抱歉不记得了!这是很久以前,我搬走了:) – ufk 2017-09-06 10:15:27