2010-03-04 15 views
9

Próbuję zapisać zwrócone dane z żądania HTTP do zmiennej.libcurl Żądanie HTTP, aby zapisać odpowiedź na zmienną - C++

Poniższy kod automatycznie wydrukuje odpowiedź żądania, ale potrzebuję go, aby zapisać odpowiedź na znak lub ciąg znaków.

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

Odpowiedz

15

myślę, że będzie trzeba napisać funkcję przekazać jako zapisu zwrotnego poprzez CURLOPT_WRITEFUNCTION (patrz this). Alternatywnie można utworzyć plik tymczasowy i przekazać jego deskryptor pliku poprzez CURLOPT_WRITEDATA (następna opcja wymieniona na tej stronie). Następnie odtworzysz dane z pliku tymczasowego w ciągu znaków. Nie najładniejsze z rozwiązań, ale przynajmniej nie musisz zadzierać z buforami i wskaźnikami funkcji.

EDIT: Ponieważ nie chcesz pisać do pliku, coś jak to może działać:

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

ZASTRZEŻENIE: Nie testowałem tego i jestem nieco zardzewiałe w C++, ale możesz go wypróbować.

+0

Byłem już w tym łączu, ale nie mogłem zrozumieć, jak to zrobić, ze wskaźnikami i wszystkim. i sprawa z plikiem nie jest dla mnie dobra, ponieważ mam małą ilość danych i potrzebuję, aby była bardzo szybka .. – shaimagz

+0

Nie winię cię. Zobacz moją edycję. –

+0

działa dla mnie. Używam string * jako ostatni typ parametru w write_to_string, to oszczędza mi rzutowania. – Synox

0

Aby kod był bardziej zrozumiały, chciałbym, aby funkcja write_to_string była czymś w tym stylu.

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

W tym przypadku strumień 'std :: string 'jest lokalny dla funkcji, więc wszystkie dane zostaną utracone po zakończeniu funkcji ... – Charles

Powiązane problemy