A lightweight cross-platform modern C++ HTTP/HTTPS and WebSocket client library.
There are few C++ HTTP libraries out there, but most of them are lack of ssl support. Some of the libraries I have used before are good, such as cpprestsdk, Beasts, libwebsockets etc., but either they have a big footprint, or not easy to setup and use, especially on Windows.
Slicksocket is build on top of libwebsockets. Libwebsockets is a great C library. It not only support both client and server, but also support most of protocols including latest HTTP2 and WSS2. Although Libwebsockets provided 50 minimal examples, but it is missing a good tutorial and user guide. For a new user, it will take some time to learn and figure out how to make things work. The goal of Slicksocket is to remove the hussle away by providing a lightweight, easy to use modern C++ library.
- Use latest C++ 11/14 standard.
- Cross-platform. Easy to compile and use on Windows, Linux and Mac OS X.
- Support HTTP/HTTPS and WebSocket.
- Only depends on libwebsockets (and Of cause OpenSSL for HTTPS).
- Lock-free design, have very good performance.
- Support both Synchronous and Asynchronous HTTP/HTTPS request.
Build Slicksockt
Tutorial
Caveats
git clone https://github.com/microsoft/vcpkg
On Windows run:
.\vcpkg\bootstrap-vcpkg.bat
On Mac or Linux run:
./vcpkg/boostrap-vcpkg.sh
For more information about vcpkg, please visit https://github.com/microsoft/vcpkg
./vcpkg/vcpkg install libwebsockets
git clone https://github.com/SlickTech/slicksocket.git
cd slicksocket
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
cmake --build . --target slicksocket
NOTE: By default, it makes a release build. To make debug build, use:
cmake .. -DCMAKE_BUILD_TYPE=Debug
NOTE: If cmake failed because it can't find OpenSSL, it might happen if you are build against a non-distro OpenSSL or installed OpenSSL using brew on Mac, please use follow command:
cmake .. -DOPENSSL_ROOT_DIR=<OpenSSL_install_path> \
-DCMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE=<OpenSSL_install_path>
NOTE: By default, above command makes a shared library. To make a static library, run:
cmake --build . --target slicksocket_static
cmake --build .
will create both shared and static library.
Set up project from CMake:
cmake_minimum_required(VERSION 3.7)
project(sample)
include_directory(<slicksocket_include_path>/include)
add_executable(sample main.cpp)
if (WIN32)
target_link_libraries(sample PRIVATE slicksocket websockets openssl libssl libcrypto ws2_32)
else()
target_link_libraries(sample PRIVATE slicksocket websockets_shared ssl crypto pthread)
endif()
NOTE: Substitute '<slicksocket_include_path>' to slicksocket include path on your machine.
Using http_client in your code:
// sampel.cpp
#include <slicksocket/http_client.h>
#include <iostream>
using namespace slick::net;
int main(int argc, char* argv[]) {
http_client client("https://api.pro.coinbase.com");
// GET request
// Synchronous request
auto rsp = client.request("GET", "/products");
if (rsp.status != 200) {
std::cerr << "Failed to get products";
return 1;
}
std::cout << rsp.respnse_text << std:endl;
// Asynchronous request
std::atomic_bool completed {false};
client->request("GET", "/products", [](http_respose rsp) {
if (rsp.status != 200) {
std::cerr << "Failed to get products";
return;
}
std::cout << rsp.respnse_text << std:endl;
completed.store(true, std::memory_order_release);
});
// POST request
http_client client2("https://postman-echo.com");
auto request = std::make_shared<http_request>("/post");
request->add_header("Authorization", "testxxxxxxxxxxxxxxxxxxxx");
request->add_body("{\"name\":\"Tom\"}", "application/json");
response = client2.request("POST", std::move(request));
std::cout << "POST response: "
<< response.status << " " << response.response_text << std::endl;
// DELETE request - delete depends on serever implementation
// delete through request url
request = std::make_shared<http_request>("/12345");
response = client2.request("DELETE", std::move(request));
std::cout << response.response_text << std::endl;
// delete through request body
request = std::make_shared<http_request>("/");
request->add_body("{\"id\": 12345}", "application/json");
response = client2.request("DELETE", std::move(request));
std::cout << response.response_text << std::endl;
while (!completed.load(std::memory_order_relaxed));
return 0;
}
- Need multipart form-data support.