2010-03-04 10 views
9

Ich versuche, die zurückgegebenen Daten von HTTP-Anfrage in eine Variable zu speichern.libcurl HTTP-Anfrage zu speichern Antwort in Variable - C++

Der folgende Code wird automatisch die Antwort der Anfrage drucken, aber ich brauche es, um die Antwort auf ein Zeichen oder eine Zeichenfolge zu speichern.

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; 
} 

Antwort

15

Ich denke, dass Sie eine Funktion schreiben als ein Schreib Rückruf passieren über CURLOPT_WRITEFUNCTION (siehe this). Alternativ können Sie eine temporäre Datei erstellen und den Dateideskriptor über CURLOPT_WRITEDATA (die nächste auf dieser Seite aufgelistete Option) übergeben. Dann würden Sie die Daten aus der temporären Datei in eine Zeichenfolge zurücklesen. Nicht die schönsten Lösungen, aber zumindest müssen Sie sich nicht mit Puffern und Funktionszeigern herumärgern.

EDIT: Da Sie nicht in eine Datei schreiben wollen, so etwas wie dies funktionieren könnte:

#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; 
} 

HAFTUNGSAUSSCHLUSS: Ich kann das nicht getestet haben, und ich bin ein bisschen Rusty auf C++, aber Sie können es ausprobieren.

+0

Ich war bereits in diesem Link, aber ich konnte nicht verstehen, wie man das macht, mit den Zeigern und allem. und die Datei ist nicht gut für mich, weil ich eine kleine Menge von Daten habe und ich brauche es sehr schnell .. – shaimagz

+0

Ich mache dir keine Vorwürfe. Siehe meine Bearbeitung. –

+0

funktioniert für mich. Ich benutze string * als letzten Parametertyp in write_to_string, das spart mir ein Casting. – Synox

2

Hier ist ein Beispiel für Sie http://code.google.com/p/aws4c/source/browse/trunk/aws4c.c#637.

T.Yates ist richtig, Sie müssen eine Funktion machen, die die Daten erhalten wird. Und lassen Sie CURL über Ihre Funktion mit CURLOPT_WRITEFUNCTION wissen.

+0

können Sie mir sagen, wie man das mit ein wenig mehr Details macht? wie wohin mit CURLOPT_WRITEFUNCTION? – shaimagz

0

Um den Code verständlicher zu machen, würde ich die write_to_string Funktion so etwas haben.

+0

Darin ist Ihr 'std :: string stream' lokal für die Funktion, so dass alle Daten nach dem Ende der Funktion verloren gehen ... – Charles