C++ library for easy networking
kurlyk — это ещё одна библиотека, реализующая HTTP и WebSocket клиенты для C++. Построена как обертка над curl
и Simple-WebSocket-Server
, предоставляя упрощённый интерфейс для работы с HTTP и WebSocket в C++ приложениях. Она поддерживает асинхронное выполнение HTTP-запросов с ограничением скорости и повторными попытками, а также работу с WebSocket-соединениями.
Если вам не подошли другие библиотеки, такие как easyhttp-cpp, curl_request, curlpp-async, curlwrapper, curl-Easy-cpp, curlpp11, easycurl, curl-cpp-wrapper… возможно, стоит попробовать kurlyk
.
- Асинхронное выполнение HTTP и WebSocket запросов
- Поддержка ограничения скорости для предотвращения перегрузки сети
- Автоматическое переподключение с настраиваемыми параметрами
- Простота использования через интуитивно понятный интерфейс классов
- Ориентация на использование в небольших приложениях
- Поддержка С++11
Примеры находятся в папке examples
. Ниже приведены основные примеры использования библиотеки.
Этот пример показывает, как подключиться к WebSocket серверу, отправить сообщение и обработать различные события (открытие соединения, получение сообщения, закрытие соединения и ошибки).:
#include <kurlyk.hpp>
#include <thread>
#include <chrono>
int main() {
// Создаём клиент WebSocket с указанным URL сервера
kurlyk::WebSocketClient client("wss://echo-websocket.fly.dev/");
// Настраиваем обработчик событий WebSocket
client.on_event([](std::unique_ptr<kurlyk::WebSocketEventData> event) {
switch (event->event_type) {
case kurlyk::WebSocketEventType::Open:
KURLYK_PRINT << "Соединение установлено" << std::endl;
// Выводим HTTP версию и заголовки
KURLYK_PRINT << "HTTP версия: " << event->sender->get_http_version() << std::endl;
KURLYK_PRINT << "Заголовки:" << std::endl;
for (const auto& header : event->sender->get_headers()) {
KURLYK_PRINT << header.first << ": " << header.second << std::endl;
}
// Отправляем сообщение
event->sender->send_message("Привет, WebSocket!", 0, [](const std::error_code& ec) {
if (ec) {
KURLYK_PRINT << "Ошибка отправки сообщения: " << ec.message() << std::endl;
} else {
KURLYK_PRINT << "Сообщение успешно отправлено" << std::endl;
}
});
break;
case kurlyk::WebSocketEventType::Message:
KURLYK_PRINT << "Получено сообщение: " << event->message << std::endl;
// Отправляем ответ
event->sender->send_message("Привет снова!");
break;
case kurlyk::WebSocketEventType::Close:
KURLYK_PRINT << "Соединение закрыто: " << event->message
<< "; Код статуса: " << event->status_code << std::endl;
break;
case kurlyk::WebSocketEventType::Error:
KURLYK_PRINT << "Ошибка: " << event->error_code.message() << std::endl;
break;
};
});
// Подключаемся к серверу
KURLYK_PRINT << "Подключение..." << std::endl;
client.connect();
// Ожидаем некоторое время для приёма сообщений
std::this_thread::sleep_for(std::chrono::seconds(10));
// Отправляем последнее сообщение через класс клиента
client.send_message("Пока!");
// Отключаемся от сервера
KURLYK_PRINT << "Отключение..." << std::endl;
client.disconnect_and_wait();
KURLYK_PRINT << "Конец работы" << std::endl;
return 0;
}
Эти примеры показывают, как использовать HTTP-клиент библиотеки kurlyk для выполнения различных запросов и обработки ответов.
#include <kurlyk.hpp>
#include <iostream>
// Функция для вывода информации об ответе
void print_response(const kurlyk::HttpResponsePtr& response) {
KURLYK_PRINT
<< "ready: " << response->ready << std::endl
<< "response: " << response->content << std::endl
<< "error_code: " << response->error_code << std::endl
<< "status_code: " << response->status_code << std::endl
<< "----------------------------------------" << std::endl;
}
int main() {
kurlyk::init(true);
kurlyk::HttpClient client("https://httpbin.org");
// Отправка GET запроса с обработчиком
client.get("/ip", kurlyk::QueryParams(), kurlyk::Headers(),
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});
// Отправка POST запроса с обработчиком
client.post("/post", kurlyk::QueryParams(), {{"Content-Type", "application/json"}}, "{\"text\":\"Sample POST Content\"}",
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});
kurlyk::deinit();
return 0;
}
#include <kurlyk.hpp>
#include <future>
#include <iostream>
int main() {
kurlyk::init(true);
kurlyk::HttpClient client("https://httpbin.org");
// Асинхронный GET запрос
auto future_response = client.get("/get", kurlyk::QueryParams{{"param", "value"}}, kurlyk::Headers());
kurlyk::HttpResponsePtr response = future_response.get();
print_response(response);
// Асинхронный POST запрос
auto future_post = client.post("/post", kurlyk::QueryParams(), kurlyk::Headers{{"Header", "Value"}}, "Async POST Content");
kurlyk::HttpResponsePtr post_response = future_post.get();
print_response(post_response);
kurlyk::deinit();
return 0;
}
#include <kurlyk.hpp>
#include <iostream>
int main() {
kurlyk::init(true);
kurlyk::HttpClient client("https://httpbin.org");
// Устанавливаем параметры прокси
client.set_proxy("127.0.0.1", 8080, "username", "password", kurlyk::ProxyType::HTTP);
// Отправка GET запроса через прокси
client.get("/ip", kurlyk::QueryParams(), kurlyk::Headers(),
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});
kurlyk::deinit();
return 0;
}
#include <kurlyk.hpp>
#include <iostream>
int main() {
kurlyk::init(true);
// Асинхронный GET запрос с использованием standalone функции
uint64_t request_id = kurlyk::http_get("https://httpbin.org/ip", kurlyk::QueryParams(), kurlyk::Headers(),
[](const kurlyk::HttpResponsePtr response) {
print_response(response);
});
std::system("pause");
kurlyk::cancel_request_by_id(request_id).wait();
kurlyk::deinit();
return 0;
}
Для работы библиотеки kurlyk в среде MinGW потребуются следующие зависимости:
-
Для WebSocket:
- Simple-WebSocket-Server
- Boost.Asio или standalone Asio
- OpenSSL (LTS версия Win64 OpenSSL v3.0.15)
-
Для HTTP:
Все зависимости также добавлены в проект в виде субмодулей, находящихся в папке libs
.
- Добавьте в проект пути к OpenSSL (пример для версии 3.4.0):
OpenSSL-Win64/include
OpenSSL-Win64/lib/VC/x64/MD
OpenSSL-Win64/bin
- Подключите библиотеки OpenSSL из папки
lib/VC/x64/MD
:
capi.lib
dasync.lib
libcrypto.lib
libssl.lib
openssl.lib
ossltest.lib
padlock.lib
- Добавьте в проект путь к asio (пример для репозитория Asio):
asio/asio/include
- Задайте макрос
ASIO_STANDALONE
в параметрах проекта или перед подключениемkurlyk.hpp
:
#define ASIO_STANDALONE
#include <kurlyk.hpp>
Примечание: Для Boost.Asio указывать макрос
ASIO_STANDALONE
не нужно.
- Добавьте в проект пути для
curl
(пример для версии 8.11.0):
curl-8.11.0_1-win64-mingw/bin
curl-8.11.0_1-win64-mingw/include
curl-8.11.0_1-win64-mingw/lib
- Подключите библиотеки
curl
из папкиlib
:
libcurl.a
libcurl.dll.a
Добавьте в проект путь к заголовочным файлам библиотеки:
Simple-WebSocket-Server
Также добавьте следующие библиотеки в линкер:
ws2_32
wsock32
crypt32
Добавьте в проект путь к заголовочным файлам библиотеки:
kurlyk/include
kurlyk — это header-only библиотека, поэтому достаточно просто подключить её через #include <kurlyk.hpp>
и начать использовать.
В процессе написания.
Эта библиотека распространяется под лицензией MIT. Подробности смотрите в файле LICENSE в репозитории.
Если у вас возникли вопросы или проблемы при использовании библиотеки, вы можете обратиться к документации или оставить вопрос в разделе Issues на GitHub.
Одним словом, kurlyk!