Files
cpp-httplib/docs-src/pages/ja/cookbook/c10-stream-response.md
2026-04-11 20:40:08 -04:00

2.1 KiB
Raw Permalink Blame History

title, order, status
title order status
C10. レスポンスをストリーミングで受信する 10 draft

レスポンスのボディをチャンクごとに受け取りたいときは、ContentReceiverを使います。大きなファイルを扱うときはもちろん、NDJSON改行区切りJSONやログストリームのように「届いた分だけ先に処理したい」ケースでも便利です。

チャンクごとに処理する

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

auto res = cli.Get("/logs/stream",
  [](const char *data, size_t len) {
    std::cout.write(data, len);
    std::cout.flush();
    return true; // falseを返すと受信を中止
  });

サーバーから届いたデータが、到着した順にラムダに渡されます。コールバックがfalseを返すとダウンロードを途中で止められます。

NDJSONを行単位でパースする

バッファを使って改行区切りのJSONを1行ずつ処理する例です。

std::string buffer;

auto res = cli.Get("/events",
  [&](const char *data, size_t len) {
    buffer.append(data, len);
    size_t pos;
    while ((pos = buffer.find('\n')) != std::string::npos) {
      auto line = buffer.substr(0, pos);
      buffer.erase(0, pos + 1);
      if (!line.empty()) {
        auto j = nlohmann::json::parse(line);
        handle_event(j);
      }
    }
    return true;
  });

バッファに貯めながら、改行が見つかるたびに1行を取り出してパースします。ストリーミングAPIをリアルタイムに処理する基本パターンです。

Warning: ContentReceiverを渡すと、res->body空のままになります。ボディは自分でコールバック内で保存するか処理するかしてください。

ダウンロードの進捗を知りたい場合はC11. 進捗コールバックを使うと組み合わせましょう。 Server-Sent EventsSSEを扱うときはE04. SSEをクライアントで受信するも参考になります。