base on C++ Requests: Curl for People, a spiritual port of Python Requests. # C++ Requests: Curl for People <img align="right" height="40" src="http://i.imgur.com/d9Xtyts.png"> [![Documentation](https://img.shields.io/badge/docs-online-informational?style=flat&link=https://docs.libcpr.dev/)](https://docs.libcpr.dev/) ![CI](https://github.com/libcpr/cpr/workflows/CI/badge.svg) [![Gitter](https://badges.gitter.im/libcpr/community.svg)](https://gitter.im/libcpr/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) ## Announcements * This project is being maintained by [Fabian Sauter](https://github.com/com8) and [Kilian Traub](https://github.com/KingKili). * For quick help, and discussion libcpr also offers a [gitter](https://gitter.im/libcpr/community?utm_source=share-link&utm_medium=link&utm_campaign=share-link) chat. ## Supported Releases | Release | Min. C++ Standard | Status | Notes | |---------------------------|-------------------|--------------------------|-------| | master | `cpp17` | ![alt text][preview] | | | 1.14.x | `cpp17` | ![alt text][supported] | | | 1.10.x - 1.13.x | `cpp17` | ![alt text][unsupported] | | | <= 1.9.x | `cpp11` | ![alt text][unsupported] | | [unsupported]: https://img.shields.io/badge/-unsupported-red "unsupported" [supported]: https://img.shields.io/badge/-supported-green "supported" [preview]: https://img.shields.io/badge/-preview-orange "preview" ## TLDR C++ Requests is a simple wrapper around [libcurl](http://curl.haxx.se/libcurl) inspired by the excellent [Python Requests](https://github.com/kennethreitz/requests) project. Despite its name, libcurl's easy interface is far from simple, and errors and frustration often arise from mistakes or misuse. By leveraging the more expressive features of `C++17` (or `C++11` if using cpr <`= 1.9.x), this library distills the process of making network calls into a few clear and concise idioms. Here's a quick GET request: ```c++ #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](https://gist.github.com/whoshuu/2dc858b8730079602044). ## Documentation [![Documentation](https://img.shields.io/badge/docs-online-informational?style=for-the-badge&link=https://docs.libcpr.dev/)](https://docs.libcpr.dev/) You can find the latest documentation [here](https://docs.libcpr.dev/). It's a work in progress, but it should give you a better idea of how to use the library than the [tests](https://github.com/libcpr/cpr/tree/master/test) 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](https://curl.haxx.se/libcurl/c/threadsafe.html) * OpenSSL and WinSSL support for HTTPS requests * Server Sent Events (SSE) handling ## Planned For a quick overview about the planned features, have a look at the next [Milestones](https://github.com/libcpr/cpr/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`. ```cmake include(FetchContent) FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git GIT_TAG c492b4fed1fd7288eacec6fe8d89e37df78d373a.12.0) # 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: ```cmake 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**](https://github.com/libcpr/example-cmake-fetch-content). #### 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](https://github.com/libcpr/cpr/pull/645)) ```Bash 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'](https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html). ```Bash 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`: ```cmake 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. ```Bash 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](https://github.com/hedronvision/bazel-make-cc-https-easy) or `cpr` can be added as an extension by adding the following lines to your bazel MODULE file (tested with Bazel 8). Edit the versions as needed. ```starlark bazel_dep(name = "curl", version = "8.8.0.bcr.3") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "zlib", version = "1.3.1.bcr.5") bazel_dep(name = "boringssl", version = "0.20250212.0") bazel_dep(name = "rules_foreign_cc", version = "0.14.0") http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "cpr", url = "https://github.com/libcpr/cpr/archive/refs/tags/1.11.2.tar.gz", strip_prefix = "cpr-1.11.2", sha256 = "3795a3581109a9ba5e48fbb50f9efe3399a3ede22f2ab606b71059a615cd6084", build_file_content = """ load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") filegroup( name = "srcs", srcs = glob(["**"], ["bazel-*/**"]), visibility = ["//visibility:public"], ) cmake( name = "cpr", cache_entries = { }, tags = ["requires-network"], includes = ["include/cpr"], lib_source = ":srcs", out_shared_libs = select({ "@platforms//os:macos": ["libcpr.dylib"], "@platforms//os:windows": ["libcpr.dll"], "//conditions:default": ["libcpr.so.1"], }), visibility = ["//visibility:public"], ) """ ) ``` ### 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: * [Arch Linux (AUR)](https://aur.archlinux.org/packages/cpr) * [Fedora Linux](https://src.fedoraproject.org/rpms/cpr) 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](https://www.nuget.org/packages/libcpr/) ### Port for macOS On macOS you may install cpr via [MacPorts.org](https://ports.macports.org/port/cpr) (arm64, x86_64, powerpc) ### FreeBSD Port On FreeBSD, you can issue `pkg install cpr` or use the Ports tree to install it. ## 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 to `C++17` as a requirement. * If you would like to perform https requests `OpenSSL` and its development libraries are required. * If you do not use the built-in version of [curl](https://github.com/curl/curl) but instead use your systems version, make sure you use a version `>= 7.71.0`. Lower versions are not supported. This means you need Debian `>= 11` or Ubuntu `>= 22.04 LTS`. * [`The Meson Build System`](https://mesonbuild.com/) is required build PSL from source ([PSL support for curl](https://everything.curl.dev/build/deps.html#libpsl)). For more information take a look at the `CPR_CURL_USE_LIBPSL` and `CPR_USE_SYSTEM_LIB_PSL` CMake options. ## Building cpr - Using vcpkg You can download and install cpr using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: ```Bash 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](https://github.com/Microsoft/vcpkg) on the vcpkg repository. ## Building cpr - Using Conan You can download and install `cpr` using the [Conan](https://conan.io/) package manager. Setup your CMakeLists.txt (see [Conan documentation](https://docs.conan.io/en/latest/integrations/build_system.html) on how to use MSBuild, Meson and others). An example can be found [**here**](https://github.com/libcpr/example-cmake-conan). 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](https://github.com/conan-io/conan-center-index) on the `conan-center-index` repository. ", Assign "at most 3 tags" to the expected json: {"id":"5185","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"