mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-04-12 03:38:30 +00:00
2.2 KiB
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->bodyはstd::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. 進捗コールバックを使うを参照してください。