2010-04-05 49 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