2010-03-04 8 views
9

Sto provando a salvare i dati restituiti dalla richiesta HTTP in una variabile.libcurl Richiesta HTTP per il salvataggio della risposta in variabile - C++

Il codice seguente stamperà automaticamente la risposta della richiesta, ma mi serve per salvare la risposta a un carattere oa una stringa.

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

risposta

15

Penso che si dovrà scrivere una funzione per passare come un callback scrittura tramite CURLOPT_WRITEFUNCTION (vedi this). In alternativa è possibile creare un file temporaneo e passare il relativo descrittore di file tramite CURLOPT_WRITEDATA (l'opzione successiva elencata in quella pagina). Quindi rileggerei i dati dal file temporaneo in una stringa. Non è la soluzione più carina, ma almeno non devi fare confusione con i buffer e i puntatori di funzione.

EDIT: Dal momento che non si vuole scrivere in un file, qualcosa di simile potrebbe funzionare:

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

NEGAZIONE: non ho ancora testato questo, e io sono un po ' arrugginito su C++, ma puoi provarlo.

+0

Ero già in quel collegamento ma non riuscivo a capire come farlo, con i puntatori e tutto. e la cosa del file non è buona per me, perché ho una piccola quantità di dati e ho bisogno che sia molto veloce .. – shaimagz

+0

Non ti biasimo. Vedi la mia modifica. –

+0

funziona per me. io uso string * come ultimo parametro in write_to_string, questo mi salva un casting. – Synox

0

Per rendere il codice più comprensibile, avrei la funzione write_to_string qualcosa di simile.

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

In questo, il tuo 'std :: string stream' è locale alla funzione, quindi tutti i dati andrebbero persi al termine della funzione ... – Charles