ЗАВИХРЕНИЕ - помещенный вывод в переменную?

Я в настоящее время использую этот код C:

CURL *curl;
CURLcode res;

curl = curl_easy_init();
if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://my-domain.org/");
    res = curl_easy_perform(curl);

    curl_easy_cleanup(curl);
}

Это печатает вывод на консоли. Как я могу получить тот же вывод, но считать его в, скажем, строку? (Это, вероятно, основной вопрос, но я еще не понимаю libcurl API...),

Спасибо за любую справку!

Mike

14
задан Mike 5 April 2010 в 09:17
поделиться

3 ответа

Это можно сделать с помощью

curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, write_data);

, который устанавливает функцию обратного вызова write_data , которая является функцией с подписью

size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);

. Если вы хотите, чтобы userp был какой-то внутренней структурой, которую вы используете в своей программе вызовите

curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &internal_struct);

, чтобы получить указатель на internal_struct , передаваемый при каждом вызове write_data .

2
ответ дан 1 December 2019 в 12:26
поделиться

Вам нужно передать функцию и буфер, чтобы записать их в буфер.

/* setting a callback function to return the data */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback_func);

/* passing the pointer to the response as the callback parameter */
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &response);


/* the function to invoke as the data recieved */
size_t static write_callback_func(void *buffer,
                        size_t size,
                        size_t nmemb,
                        void *userp)
{
    char **response_ptr =  (char**)userp;

    /* assuming the response is a string */
    *response_ptr = strndup(buffer, (size_t)(size *nmemb));

}

Дополнительная информация здесь .

16
ответ дан 1 December 2019 в 12:26
поделиться

вам нужна функция обратного вызова записи. Я использую такую ​​функцию, чтобы читать ответ, ошибку и иметь возможность предоставить свои собственные заголовки:

size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
    std::string buf = std::string(static_cast<char *>(ptr), size * nmemb);
    std::stringstream *response = static_cast<std::stringstream *>(stream);
    response->write(buf.c_str(), (std::streamsize)buf.size());
    return size * nmemb;
}

bool CurlGet(
    const std::string &url, 
    const std::vector<std::string> &headers, 
    std::stringstream &response, 
    std::string &error)
{

    curl_global_init(CURL_GLOBAL_ALL);

    curl_slist *headerlist = NULL;

    std::vector<std::string>::const_iterator it;
    for (it = headers.begin(); it < headers.end(); it++) {
        headerlist = curl_slist_append(headerlist, it->c_str());
    }   

    CURL *curl = curl_easy_init();
    char ebuf[CURL_ERROR_SIZE];
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, ebuf);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
    CURLcode res = curl_easy_perform(curl); 
    curl_easy_cleanup(curl);
    curl_slist_free_all(headerlist);

    if (res != CURLE_OK)
        error = ebuf;
    else
        error.clear();

    return res == CURLE_OK; 
}
4
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: