2010-04-05 9 views
14

मैं इस समय इस सी कोड का उपयोग कर रहा: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 एपीआई समझ में नहीं आता है ...)

किसी भी मदद के लिए धन्यवाद!

माइक

उत्तर

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, कुछ उदाहरण के साथ अपडेट किया गया, और सी और php, मूलतः एक ही अवधारणाओं के लिए एक लिंक:
यहाँ है कि मैं क्या कर रही अंत में समाप्त हो गया है। – YOU

+0

@ एसमार्क, अच्छा, अच्छा लिंक! – Mike

+0

अच्छा! संक्षिप्त, भी :) – KeatsKelleher

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 कुछ आंतरिक struct आप अपने प्रोग्राम में उपयोग कर रहे हैं चाहते हैं, फोन

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

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

क्यों "शून्य * उपयोगकर्ता"? – schaiba

+0

@schaiba - क्षमा करें याद नहीं है! यह बहुत समय पहले था और मैं जाने के लिए चले गए :) – ufk

संबंधित मुद्दे