2010-03-04 8 views
9

मैं लौटा डेटा HTTP चर से एक चर में सहेजने की कोशिश कर रहा हूं।libcurl HTTP अनुरोध में चर को बचाने के लिए अनुरोध - C++

नीचे दिया गया कोड स्वचालित रूप से अनुरोध के उत्तर को प्रिंट करेगा, लेकिन मुझे इसे एक char या स्ट्रिंग के जवाब को सहेजने की आवश्यकता है।

int main(void) 
{ 
     char * result; 
     CURL *curl; 
     CURLcode res; 
     curl = curl_easy_init(); 
     if(curl) { 
      curl_easy_setopt(curl, CURLOPT_URL, "http://www.browsarity.com/"); 

      res = curl_easy_perform(curl); 
      curl_easy_cleanup(curl); 
     } 
     return 0; 
} 

उत्तर

15

मुझे लगता है कि आप (this देखें) CURLOPT_WRITEFUNCTION के माध्यम से एक लिखने कॉलबैक के रूप में पारित करने के लिए एक समारोह लिखने के लिए होगा। वैकल्पिक रूप से आप एक अस्थायी फ़ाइल बना सकते हैं और CURLOPT_WRITEDATA (उस पृष्ठ पर सूचीबद्ध अगला विकल्प) के माध्यम से अपनी फ़ाइल डिस्क्रिप्टर पास कर सकते हैं। फिर आप अस्थायी फ़ाइल से डेटा को स्ट्रिंग में वापस पढ़ लेंगे। समाधानों का सबसे सुंदर नहीं है, लेकिन कम से कम आपको बफर और फ़ंक्शन पॉइंटर्स के साथ गड़बड़ नहीं करना है।

संपादित: चूंकि आप एक फ़ाइल पर लिखने में नहीं करना चाहते, कुछ इस तरह काम कर सकते हैं:

#include <string> 

size_t write_to_string(void *ptr, size_t size, size_t count, void *stream) { 
    ((string*)stream)->append((char*)ptr, 0, size*count); 
    return size*count; 
} 

int main(void) { 
    // ... 
    if (curl) { 
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.browsarity.com/"); 

    string response; 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_to_string); 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 

    res = curl_easy_perform(curl); 
    curl_easy_cleanup(curl); 

    // The "response" variable should now contain the contents of the HTTP response 
    } 
    return 0; 
} 

अस्वीकरण: मैं इस परीक्षण नहीं किया है, और मैं थोड़ा हूँ सी ++ पर जंगली, लेकिन आप इसे आजमा सकते हैं।

+0

मैं पहले से ही उस लिंक में था लेकिन मुझे समझ में नहीं आया कि पॉइंटर्स और सभी के साथ यह कैसे करना है। और फ़ाइल की बात मेरे लिए अच्छा नहीं है, क्योंकि मेरे पास थोड़ी सी मात्रा है और मुझे इसे बहुत तेज होने की आवश्यकता है .. – shaimagz

+0

मैं आपको दोष नहीं देता हूं। मेरा संपादन देखें। –

+0

मेरे लिए काम करता है। मैं string_to_string में अंतिम पैरामीटर प्रकार के रूप में स्ट्रिंग * का उपयोग करता हूं, यह मुझे एक कास्टिंग बचाता है। – Synox

2

यहां आपके लिए http://code.google.com/p/aws4c/source/browse/trunk/aws4c.c#637 का एक उदाहरण है।

टी। येट्स सही है, आपको एक ऐसा फ़ंक्शन बनाना होगा जो डेटा प्राप्त करेगा। और CURLLOPT_WRITEFUNCTION का उपयोग करके CURL को अपने फ़ंक्शन के बारे में बताएं।

+0

क्या आप मुझे बता सकते हैं कि थोड़ा और विवरण के साथ ऐसा कैसे करें? जैसे CURLOPT_WRITEFUNCTION कहां रखना है? – shaimagz

0

कोड को और अधिक समझने योग्य बनाने के लिए, मेरे पास write_to_string इस तरह कुछ कार्य करेगा।

size_t write_to_string(void *ptr, size_t size, size_t nmemb, std::string stream) 
{ 
    size_t realsize = size * nmemb; 
    std::string temp(static_cast<const char*>(ptr), realsize); 
    stream.append(temp); 
    return realsize; 
} 
+0

इसमें, आपकी 'std :: string stream' फ़ंक्शन के लिए स्थानीय है, इसलिए फ़ंक्शन समाप्त होने के बाद सभी डेटा खो जाएंगे ... – Charles

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