2010-03-04 13 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; 
} 

부인이 : :이 테스트를하지 않은, 나는 조금 해요 당신이 파일에 기록하지 않기 때문에, 이런 식으로 뭔가를 작동 할 수 있습니다 녹슨 C + +,하지만 당신은 그것을 밖으로 시도 할 수 있습니다.

+0

나는 이미 그 링크에 있었지만 포인터와 함께 그 방법을 이해할 수 없었다. 파일 내용이 저에게 좋지 않습니다. 왜냐하면 데이터 량이 적기 때문에 매우 빠릅니다. – shaimagz

+0

나는 당신을 비난하지 않습니다. 내 편집을 참조하십시오. –

+0

이 저에게 효과적입니다. write_to_string에서 마지막 매개 변수 유형으로 string *을 사용하면 캐스팅이 절약됩니다. – Synox

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

관련 문제