Ответ
libcurl — это кроссплатформенная клиентская библиотека на языке C для передачи данных по URL, поддерживающая множество протоколов (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, SMTP и др.). Она предоставляет простой и единообразный API для выполнения сетевых запросов. В C++ проектах она часто используется через C-интерфейс или C++-обёртки.
Ключевые возможности:
- Поддержка SSL/TLS (через OpenSSL, Schannel, Secure Transport и др.).
- Асинхронные (non-blocking) и синхронные вызовы.
- Прокси, HTTP-куки, аутентификация (Basic, Digest, NTLM, Kerberos).
- Загрузка и отправка файлов, поддержка многопоточности.
- Минимальные зависимости, высокая производительность.
Базовый пример синхронного HTTP GET-запроса на C++:
#include <iostream>
#include <curl/curl.h>
// Callback-функция для записи полученных данных
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* userp) {
size_t totalSize = size * nmemb;
userp->append(static_cast<char*>(contents), totalSize);
return totalSize;
}
int main() {
CURL* curl;
CURLcode res;
std::string readBuffer;
curl_global_init(CURL_GLOBAL_DEFAULT); // Инициализация libcurl
curl = curl_easy_init();
if (curl) {
// Установка опций запроса
curl_easy_setopt(curl, CURLOPT_URL, "https://api.example.com/data");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "MyCppApp/1.0");
// Для HTTPS рекомендуется явно задать путь к CA bundle или использовать CURLOPT_CAINFO
// curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/cacert.pem");
// Выполнение запроса
res = curl_easy_perform(curl);
// Проверка результата
if (res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << 'n';
} else {
long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
std::cout << "HTTP код ответа: " << http_code << 'n';
std::cout << "Получено данных: " << readBuffer.size() << " байтn";
// std::cout << "Тело ответа: " << readBuffer << 'n';
}
// Очистка
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
Типичные сценарии использования в C++ проектах:
- Загрузка данных из REST API (JSON/XML).
- Отправка метрик или логов на сервер.
- Реализация автообновления приложения.
- Интеграция с облачными хранилищами (загрузка/выгрузка файлов).
Альтернативы в экосистеме C++: Для более идиоматичного C++ кода можно рассмотреть библиотеки-обёртки над libcurl (например, curlpp) или нативные C++ библиотеки, такие как Boost.Beast (для HTTP/WebSocket) или cpp-httplib. Однако libcurl остаётся отраслевым стандартом благодаря своей зрелости, стабильности и широте поддерживаемых протоколов.