2010-03-04 12 views
9

Estoy tratando de guardar los datos devueltos de la solicitud HTTP en una variable.solicitud HTTP libcurl para guardar responder a la variable - C++

El código siguiente imprimirá automáticamente responden de la solicitud, pero lo necesito para salvar al responder a un char o cadena.

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

Respuesta

15

creo que tendrá que escribir una función para pasar como una devolución de llamada de escritura a través CURLOPT_WRITEFUNCTION (ver this). Alternativamente, puede crear un archivo temporal y pasar su descriptor de archivo a través del CURLOPT_WRITEDATA (la siguiente opción que figura en esa página). Luego, volvería a leer los datos del archivo temporal en una cadena. No es la solución más bonita, pero al menos no tiene que meterse con los búfers y los indicadores de función.

EDITAR: Puesto que usted no desea escribir en un archivo, algo como esto podría funcionar:

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

RENUNCIA: No he probado esto, y estoy un poco oxidado en C++, pero puedes probarlo.

+0

Ya estaba en ese enlace pero no pude entender cómo hacerlo, con los punteros y todo. y el asunto del archivo no es bueno para mí, porque tengo una pequeña cantidad de datos y necesito que sea muy rápido. – shaimagz

+0

No te culpo. Ver mi edición –

+0

funciona para mí. utilizo string * como último tipo de parámetro en write_to_string, esto me ahorra un casting. – Synox

2

Aquí se muestra un ejemplo para usted http://code.google.com/p/aws4c/source/browse/trunk/aws4c.c#637.

T.Yates es correcto, lo que tiene que hacer una función que va a recibir los datos. Y cuéntale a CURL acerca de tu función usando CURLOPT_WRITEFUNCTION.

+0

¿me puede decir cómo hacerlo con un poco más de detalles? como dónde poner CURLOPT_WRITEFUNCTION? – shaimagz

0

Para que el código sea más comprensible, que tendría la función de write_to_string algo como esto.

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

En esto, su 'std :: string stream' es local para la función, por lo que todos los datos se perderán después de que termine la función ... – Charles

Cuestiones relacionadas