Я в настоящее время использую этот код 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
Это можно сделать с помощью
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
.
Вам нужно передать функцию и буфер, чтобы записать их в буфер.
/* 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));
}
Дополнительная информация здесь .
вам нужна функция обратного вызова записи. Я использую такую функцию, чтобы читать ответ, ошибку и иметь возможность предоставить свои собственные заголовки:
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;
}