title: "C15. 圧縮を有効にする" order: 15
cpp-httplibは送信時の圧縮と受信時の解凍をサポートしています。ただし、zlibまたはBrotliを有効にしてビルドしておく必要があります。
圧縮機能を使うには、httplib.hをインクルードする前に次のマクロを定義しておきます。
#define CPPHTTPLIB_ZLIB_SUPPORT // gzip / deflate
#define CPPHTTPLIB_BROTLI_SUPPORT // brotli
#include <httplib.h>
リンク時にzlibやbrotliのライブラリも必要です。
httplib::Client cli("https://api.example.com");
cli.set_compress(true);
std::string big_payload = build_payload();
auto res = cli.Post("/api/data", big_payload, "application/json");
set_compress(true)を呼んでおくと、POSTやPUTのリクエストボディが圧縮されて送信されます。方式は、ビルドで有効なものからBrotli、gzip、Zstdの順に選ばれます。サーバー側が対応している必要があります。
httplib::Client cli("https://api.example.com");
cli.set_decompress(true); // デフォルトで有効
auto res = cli.Get("/api/data");
std::cout << res->body << std::endl;
set_decompress(true)を呼ぶと、サーバーがContent-Encoding: gzipなどで圧縮したレスポンスを自動で解凍してくれます。res->bodyには解凍済みのデータが入ります。
デフォルトで有効なので、通常は何もしなくても解凍されます。あえて生の圧縮データを触りたいときだけset_decompress(false)にしましょう。
Warning: 圧縮ライブラリを1つも有効にせずにビルドすると、
set_compress(true)を呼んでもリクエストは圧縮されません。また、ビルドに含まれていない方式で圧縮されたレスポンスを受け取ると、リクエストはError::UnsupportedContentEncodingで失敗します。マクロの定義を忘れていないか、最初に確認しましょう。