Files
cpp-httplib/docs-src/pages/ja/cookbook/c01-get-response-body.md
2026-04-10 18:16:02 -04:00

2.2 KiB

title, order, status
title order status
C01. レスポンスボディを取得する / ファイルに保存する 1 draft

文字列として取得する

httplib::Client cli("http://localhost:8080");
auto res = cli.Get("/hello");
if (res && res->status == 200) {
  std::cout << res->body << std::endl;
}

res->bodystd::stringなので、そのまま使えます。レスポンス全体がメモリに読み込まれます。

Warning: 大きなファイルをres->bodyで受け取ると、まるごとメモリに載ってしまいます。サイズが大きい場合は次のContentReceiverを使いましょう。

ファイルに保存する

httplib::Client cli("http://localhost:8080");

std::ofstream ofs("output.bin", std::ios::binary);
if (!ofs) {
  std::cerr << "Failed to open file" << std::endl;
  return 1;
}

auto res = cli.Get("/large-file",
  [&](const char *data, size_t len) {
    ofs.write(data, len);
    return static_cast<bool>(ofs);
  });

ContentReceiverを使うと、データをチャンクごとに受け取れます。ボディ全体をメモリに溜めずにファイルへ書き出せるので、大きなファイルのダウンロードにぴったりです。

コールバックからfalseを返すと、ダウンロードを途中で止められます。上の例ではofsへの書き込みが失敗したら自動的に中断します。

Detail: ダウンロード前にContent-Lengthなどのレスポンスヘッダーを確認したいときは、ResponseHandlerを組み合わせましょう。

auto res = cli.Get("/large-file",
  [](const httplib::Response &res) {
    auto len = res.get_header_value("Content-Length");
    std::cout << "Size: " << len << std::endl;
    return true; // falseを返すとダウンロードを中止
  },
  [&](const char *data, size_t len) {
    ofs.write(data, len);
    return static_cast<bool>(ofs);
  });

ResponseHandlerはヘッダー受信後、ボディ受信前に呼ばれます。falseを返せばダウンロード自体をスキップできます。

ダウンロードの進捗を表示したい場合はC11. 進捗コールバックを使うを参照してください。