2010-03-04 12 views
9

Tôi đang cố lưu dữ liệu trả về từ yêu cầu HTTP vào một biến.libcurl Yêu cầu HTTP để lưu phản hồi vào biến - C++

Mã bên dưới sẽ tự động in câu trả lời của yêu cầu, nhưng tôi cần nó để lưu câu trả lời vào một chuỗi hoặc chuỗi.

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

Trả lời

15

Tôi nghĩ rằng bạn sẽ phải viết một chức năng để vượt qua như một ghi callback qua CURLOPT_WRITEFUNCTION (xem this). Hoặc bạn có thể tạo một tệp tạm thời và chuyển bộ mô tả tệp qua CURLOPT_WRITEDATA (tùy chọn tiếp theo được liệt kê trên trang đó). Sau đó, bạn sẽ đọc lại dữ liệu từ tệp tạm thời thành một chuỗi. Không phải là đẹp nhất của các giải pháp, nhưng ít nhất bạn không phải lộn xộn với bộ đệm và con trỏ hàm.

EDIT: Vì bạn không muốn viết vào một tập tin, một cái gì đó như thế này có thể làm việc:

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

SỰ TỪ BỎ: Tôi đã không kiểm tra này, và tôi là một chút gỉ trên C++, nhưng bạn có thể thử nó.

+0

Tôi đã ở trong liên kết đó nhưng tôi không thể hiểu cách thực hiện điều đó, với con trỏ và tất cả. và điều tập tin không tốt cho tôi, bởi vì tôi có một lượng nhỏ dữ liệu và tôi cần nó rất nhanh .. – shaimagz

+0

Tôi không trách bạn. Xem chỉnh sửa của tôi. –

+0

hoạt động cho tôi. tôi sử dụng chuỗi * như kiểu tham số cuối cùng trong write_to_string, điều này giúp tôi tiết kiệm một quá trình truyền. – Synox

2

Đây là ví dụ cho bạn http://code.google.com/p/aws4c/source/browse/trunk/aws4c.c#637.

T.Yates đúng, bạn phải tạo một hàm sẽ nhận dữ liệu. Và để CURL biết về hàm của bạn bằng cách sử dụng hàm CURLOPT_WRITEFUNCTION.

+0

bạn có thể cho tôi biết cách thực hiện điều đó với một ít chi tiết hơn không? như nơi đặt CURLOPT_WRITEFUNCTION? – shaimagz

0

Để làm cho mã dễ hiểu hơn, tôi sẽ có chức năng write_to_string giống như thế này.

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

Trong trường hợp này, chuỗi 'std :: chuỗi 'của bạn là cục bộ cho hàm, vì vậy tất cả dữ liệu sẽ bị mất sau khi hàm kết thúc ... – Charles