Top Related Projects
A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.
A C++ header-only HTTP/HTTPS server and client library
Async++ concurrency framework for C++11
C++ Requests: Curl for People, a spiritual port of Python Requests.
JSON for Modern C++
Quick Overview
CPR (C++ Requests) is a modern, feature-rich HTTP client library for C++. It provides a simple and intuitive API inspired by Python's requests library, making it easy to perform HTTP requests in C++ applications. CPR is designed to be lightweight, fast, and easy to use.
Pros
- Simple and intuitive API, similar to Python's requests library
- Cross-platform support (Windows, macOS, Linux)
- Built-in SSL support with OpenSSL
- Supports various HTTP methods, headers, and authentication types
Cons
- Dependency on libcurl, which may increase project size
- Limited documentation compared to some other HTTP libraries
- Potential performance overhead compared to lower-level libraries
- May require additional setup for certain features (e.g., SSL support)
Code Examples
- Simple GET request:
#include <cpr/cpr.h>
#include <iostream>
int main() {
cpr::Response r = cpr::Get(cpr::Url{"https://api.github.com/repos/libcpr/cpr"});
std::cout << "Status code: " << r.status_code << std::endl;
std::cout << "Response body: " << r.text << std::endl;
return 0;
}
- POST request with JSON payload:
#include <cpr/cpr.h>
int main() {
cpr::Response r = cpr::Post(cpr::Url{"https://api.example.com/users"},
cpr::Header{{"Content-Type", "application/json"}},
cpr::Body{R"({"name": "John Doe", "email": "john@example.com"})"});
return 0;
}
- Asynchronous request:
#include <cpr/cpr.h>
#include <iostream>
int main() {
auto future = cpr::GetAsync(cpr::Url{"https://api.github.com/repos/libcpr/cpr"});
// Do other work here...
cpr::Response r = future.get();
std::cout << "Status code: " << r.status_code << std::endl;
return 0;
}
Getting Started
To use CPR in your project, follow these steps:
- Install CPR using a package manager or build from source.
- Include the CPR header in your C++ file:
#include <cpr/cpr.h>
- Link against the CPR library when compiling your project.
- Use the CPR API to make HTTP requests in your code:
cpr::Response r = cpr::Get(cpr::Url{"https://api.example.com"});
For more detailed installation and usage instructions, refer to the official CPR documentation.
Competitor Comparisons
A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features
Pros of curl
- Mature and widely used project with extensive documentation
- Supports a vast array of protocols and features
- Cross-platform compatibility and portability
Cons of curl
- C-based API can be complex for modern C++ developers
- Requires manual memory management
- Steeper learning curve for beginners
Code Comparison
curl:
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
cpr:
#include <cpr/cpr.h>
auto r = cpr::Get(cpr::Url{"https://example.com"});
std::cout << r.text << std::endl;
The code comparison demonstrates the simplicity of cpr compared to curl. cpr provides a more modern, C++-friendly API with automatic resource management, while curl requires manual initialization, option setting, and cleanup.
cpr builds on top of curl, offering a higher-level abstraction that simplifies HTTP requests in C++. It provides a more intuitive interface for developers familiar with modern C++ practices, while still leveraging the robust foundation of curl.
Both libraries have their merits, with curl offering more extensive protocol support and cpr providing a more streamlined experience for C++ developers focusing on HTTP requests.
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.
Pros of cpprestsdk
- More comprehensive library with support for various protocols (HTTP, WebSockets, JSON)
- Better suited for large-scale enterprise applications
- Extensive documentation and Microsoft support
Cons of cpprestsdk
- Larger footprint and potentially steeper learning curve
- Slower compilation times due to its size and complexity
- May be overkill for simple HTTP requests
Code Comparison
cpprestsdk:
#include <cpprest/http_client.h>
auto response = client.request(methods::GET, U("/api/data")).get();
auto json = response.extract_json().get();
cpr:
#include <cpr/cpr.h>
auto response = cpr::Get(cpr::Url{"https://api.example.com/data"});
auto json = nlohmann::json::parse(response.text);
Summary
cpprestsdk is a more comprehensive library suitable for complex, enterprise-level applications, while cpr is lightweight and focused primarily on HTTP requests. cpprestsdk offers broader functionality but comes with a larger footprint, while cpr is simpler to use for basic HTTP operations. The choice between them depends on the specific requirements of your project and the level of complexity you need to handle.
A C++ header-only HTTP/HTTPS server and client library
Pros of cpp-httplib
- Header-only library, making it easier to integrate into projects
- Supports both client and server-side HTTP/HTTPS functionality
- Lightweight with minimal dependencies
Cons of cpp-httplib
- Less feature-rich compared to cpr, especially for advanced use cases
- May require more manual configuration for complex scenarios
- Limited built-in support for asynchronous operations
Code Comparison
cpp-httplib:
#include <httplib.h>
int main() {
httplib::Client cli("http://example.com");
auto res = cli.Get("/");
if (res && res->status == 200) {
std::cout << res->body << std::endl;
}
}
cpr:
#include <cpr/cpr.h>
int main() {
auto r = cpr::Get(cpr::Url{"http://example.com"});
if (r.status_code == 200) {
std::cout << r.text << std::endl;
}
}
Both libraries offer straightforward ways to make HTTP requests, but cpr provides a more modern and intuitive API. cpp-httplib's approach is more traditional and may be familiar to developers used to working with raw HTTP libraries.
Async++ concurrency framework for C++11
Pros of asyncplusplus
- Focuses on asynchronous programming and parallel task execution
- Provides a more comprehensive set of asynchronous primitives (e.g., tasks, parallel_for, when_all)
- Designed for high-performance concurrent programming
Cons of asyncplusplus
- Limited to asynchronous programming, lacks HTTP-specific features
- May have a steeper learning curve for developers not familiar with concurrent programming concepts
- Less active development and smaller community compared to cpr
Code Comparison
asyncplusplus example:
#include <async++.h>
async::parallel_for(0, 100, [](int i) {
// Perform parallel operation
});
cpr example:
#include <cpr/cpr.h>
auto r = cpr::Get(cpr::Url{"https://api.example.com"});
std::cout << r.text << std::endl;
Summary
asyncplusplus is a library focused on asynchronous and parallel programming in C++, offering advanced concurrency features. cpr, on the other hand, is primarily an HTTP client library that simplifies making HTTP requests. While asyncplusplus provides powerful tools for concurrent programming, cpr excels in handling HTTP communications with a simpler API. The choice between the two depends on the specific requirements of your project: asyncplusplus for complex asynchronous operations, or cpr for straightforward HTTP interactions.
C++ Requests: Curl for People, a spiritual port of Python Requests.
Pros of cpr
- Actively maintained with regular updates and bug fixes
- Extensive documentation and examples for easy integration
- Wide range of features including SSL support and custom headers
Cons of cpr
- Larger codebase and dependencies may increase project size
- Learning curve for advanced features can be steeper
- Some users report occasional performance issues with large requests
Code Comparison
cpr example:
#include <cpr/cpr.h>
auto r = cpr::Get(cpr::Url{"https://api.github.com/repos/libcpr/cpr"});
std::cout << r.text << std::endl;
cpr> example:
#include <cpr/cpr.h>
auto r = cpr::Get(cpr::Url{"https://api.github.com/repos/libcpr/cpr>"});
std::cout << r.text << std::endl;
Note: The code comparison shows identical usage for both repositories, as cpr> is not a separate project but rather a typo or mistake in the repository name. The correct repository is libcpr/cpr, and there is no distinct libcpr/cpr> project for comparison.
JSON for Modern C++
Pros of json
- Header-only library, making it easy to integrate into projects
- Extensive documentation and examples
- Wide range of JSON manipulation features, including serialization and deserialization
Cons of json
- Larger compile times due to heavy template usage
- May have a steeper learning curve for beginners compared to cpr's simpler API
Code Comparison
json:
#include <nlohmann/json.hpp>
using json = nlohmann::json;
json j = {
{"name", "John"},
{"age", 30},
{"city", "New York"}
};
std::string serialized = j.dump();
cpr:
#include <cpr/cpr.h>
auto r = cpr::Get(cpr::Url{"https://api.example.com/data"},
cpr::Authentication{"user", "pass"},
cpr::Parameters{{"key", "value"}});
std::string response_body = r.text;
While json focuses on JSON data manipulation, cpr is primarily used for HTTP requests. json offers more comprehensive JSON handling, while cpr provides a simpler interface for making HTTP requests. The choice between them depends on the specific needs of your project, whether it's primarily JSON processing or HTTP communication.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
C++ Requests: Curl for People
Announcements
- This project is being maintained by Fabian Sauter and Kilian Traub.
- For quick help, and discussion libcpr also offer a gitter chat.
Supported Releases
Release | Min. C++ Standard | Status | Notes |
---|---|---|---|
master | cpp17 | ||
1.10.x | cpp17 | ||
1.9.x | cpp11 | Supported until 01.01.2025 | |
<= 1.8.x | cpp11 |
TLDR
C++ Requests is a simple wrapper around libcurl inspired by the excellent Python Requests project.
Despite its name, libcurl's easy interface is anything but, and making mistakes, misusing it is a common source of error and frustration. Using the more expressive language facilities of C++17
(or C++11
in case you use cpr < 1.10.0), this library captures the essence of making network calls into a few concise idioms.
Here's a quick GET request:
#include <cpr/cpr.h>
int main(int argc, char** argv) {
cpr::Response r = cpr::Get(cpr::Url{"https://api.github.com/repos/whoshuu/cpr/contributors"},
cpr::Authentication{"user", "pass", cpr::AuthMode::BASIC},
cpr::Parameters{{"anon", "true"}, {"key", "value"}});
r.status_code; // 200
r.header["content-type"]; // application/json; charset=utf-8
r.text; // JSON text string
return 0;
}
And here's less functional, more complicated code, without cpr.
Documentation
You can find the latest documentation here. It's a work in progress, but it should give you a better idea of how to use the library than the tests currently do.
Features
C++ Requests currently supports:
- Custom headers
- Url encoded parameters
- Url encoded POST values
- Multipart form POST upload
- File POST upload
- Basic authentication
- Bearer authentication
- Digest authentication
- NTLM authentication
- Connection and request timeout specification
- Timeout for low speed connection
- Asynchronous requests
- :cookie: support!
- Proxy support
- Callback interfaces
- PUT methods
- DELETE methods
- HEAD methods
- OPTIONS methods
- PATCH methods
- Thread Safe access to libCurl
- OpenSSL and WinSSL support for HTTPS requests
Planned
For a quick overview about the planed features, have a look at the next Milestones.
Usage
CMake
fetch_content:
If you already have a CMake project you need to integrate C++ Requests with, the primary way is to use fetch_content
.
Add the following to your CMakeLists.txt
.
include(FetchContent)
FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git
GIT_TAG 3b15fa82ea74739b574d705fea44959b58142eb8) # Replace with your desired git commit from: https://github.com/libcpr/cpr/releases
FetchContent_MakeAvailable(cpr)
This will produce the target cpr::cpr
which you can link against the typical way:
target_link_libraries(your_target_name PRIVATE cpr::cpr)
That should do it!
There's no need to handle libcurl
yourself. All dependencies are taken care of for you.
All of this can be found in an example here.
find_package():
If you prefer not to use fetch_content
, you can download, build, and install the library and then use CMake find_package()
function to integrate it into a project.
Note: this feature is feasible only if CPR_USE_SYSTEM_CURL is set. (see #645)
git clone https://github.com/libcpr/cpr.git
cd cpr && mkdir build && cd build
cmake .. -DCPR_USE_SYSTEM_CURL=ON
cmake --build . --parallel
sudo cmake --install .
Build Static Library
As an alternative if you want to switch between a static or shared version of cpr use '-DBUILD_SHARED_LIBS=ON/OFF'.
git clone https://github.com/libcpr/cpr.git
cd cpr && mkdir build && cd build
cmake .. -DCPR_USE_SYSTEM_CURL=ON -DBUILD_SHARED_LIBS=OFF
cmake --build . --parallel
sudo cmake --install .
In your CMakeLists.txt
:
find_package(cpr REQUIRED)
add_executable(your_target_name your_target_name.cpp)
target_link_libraries(your_target_name PRIVATE cpr::cpr)
Tests
cpr
provides a bunch of tests that can be executed via the following commands.
git clone https://github.com/libcpr/cpr.git
cd cpr && mkdir build && cd build
cmake .. -DCPR_BUILD_TESTS=ON # There are other test related options like 'CPR_BUILD_TESTS_SSL' and 'CPR_BUILD_TESTS_PROXY'
cmake --build . --parallel
ctest -VV # -VV is optional since it enables verbose output
Bazel
Please refer to hedronvision/bazel-make-cc-https-easy.
Packages for Linux Distributions
Alternatively, you may install a package specific to your Linux distribution. Since so few distributions currently have a package for cpr, most users will not be able to run your program with this approach.
Currently, we are aware of packages for the following distributions:
If there's no package for your distribution, try making one! If you do, and it is added to your distribution's repositories, please submit a pull request to add it to the list above. However, please only do this if you plan to actively maintain the package.
NuGet Package
For Windows, there is also a libcpr NuGet package available. Currently, x86 and x64 builds are supported with release and debug configuration.
The package can be found here: NuGet.org
Port for macOS
On macOS you may install cpr via MacPorts.org (arm64, x86_64, powerpc)
Requirements
The only explicit requirements are:
- a
C++17
compatible compiler such as Clang or GCC. The minimum required version of GCC is unknown, so if anyone has trouble building this library with a specific version of GCC, do let us know - in case you only have a
C++11
compatible compiler available, all versions below cpr 1.9.x are for you. The 1.10.0 release of cpr switches toC++17
as a requirement. - If you would like to perform https requests
OpenSSL
and its development libraries are required.
Building cpr - Using vcpkg
You can download and install cpr using the vcpkg dependency manager:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install cpr
The cpr
port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.
Building cpr - Using Conan
You can download and install cpr
using the Conan package manager. Setup your CMakeLists.txt (see Conan documentation on how to use MSBuild, Meson and others).
An example can be found here.
The cpr
package in Conan is kept up to date by Conan contributors. If the version is out of date, please create an issue or pull request on the conan-center-index
repository.
Top Related Projects
A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.
A C++ header-only HTTP/HTTPS server and client library
Async++ concurrency framework for C++11
C++ Requests: Curl for People, a spiritual port of Python Requests.
JSON for Modern C++
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot