--- title: "Cookbook" order: 0 status: "draft" --- 「〇〇をするには?」という問いに答えるレシピ集です。各レシピは独立しているので、必要なページだけ読めます。 ## クライアント ### 基本 - レスポンスボディを文字列で取得する / ファイルに保存する - JSON を送受信する - デフォルトヘッダーを設定する(`set_default_headers`) - リダイレクトを追従する(`set_follow_location`) ### 認証 - Basic 認証を使う(`set_basic_auth`) - Bearer トークンで API を呼ぶ ### ファイル送信 - ファイルをマルチパートフォームとしてアップロードする(`make_file_provider`) - ファイルを生バイナリとして POST する(`make_file_body`) - チャンク転送でボディを送る(Content Provider) ### ストリーミング・進捗 - レスポンスをストリーミングで受信する - 進捗コールバックを使う(`DownloadProgress` / `UploadProgress`) ### 接続・パフォーマンス - タイムアウトを設定する(`set_connection_timeout` / `set_read_timeout`) - 全体タイムアウトを設定する(`set_max_timeout`) - 接続の再利用と Keep-Alive の挙動を理解する - 圧縮を有効にする(`set_compress` / `set_decompress`) - プロキシを経由してリクエストを送る(`set_proxy`) ### エラー処理・デバッグ - エラーコードをハンドリングする(`Result::error()`) - SSL エラーをハンドリングする(`ssl_error()` / `ssl_backend_error()`) - クライアントにログを設定する(`set_logger` / `set_error_logger`) ## サーバー ### 基本 - GET / POST / PUT / DELETE ハンドラを登録する - JSON リクエストを受け取り JSON レスポンスを返す - パスパラメーターを使う(`/users/:id`) - 静的ファイルサーバーを設定する(`set_mount_point`) ### ストリーミング・ファイル - 大きなファイルをストリーミングで返す(`ContentProvider`) - ファイルダウンロードレスポンスを返す(`Content-Disposition`) - マルチパートデータをストリーミングで受け取る(`ContentReader`) - レスポンスを圧縮して返す(gzip) ### ハンドラチェーン - 全ルートに共通の前処理をする(Pre-routing handler) - Post-routing handler でレスポンスヘッダーを追加する(CORS など) - Pre-request handler でルート単位の認証を行う(`matched_route`) - `res.user_data` でハンドラ間データを渡す ### エラー処理・デバッグ - カスタムエラーページを返す(`set_error_handler`) - 例外をキャッチする(`set_exception_handler`) - リクエストをログに記録する(Logger) - クライアントが切断したか検出する(`req.is_connection_closed()`) ### 運用・チューニング - ポートを動的に割り当てる(`bind_to_any_port`) - `listen_after_bind` で起動順序を制御する - グレースフルシャットダウンする(`stop()` とシグナルハンドリング) - Keep-Alive を調整する(`set_keep_alive_max_count` / `set_keep_alive_timeout`) - マルチスレッド数を設定する(`new_task_queue`) ## TLS / セキュリティ - OpenSSL・mbedTLS・wolfSSL の選択指針(ビルド時の `#define` の違い) - SSL 証明書の検証を制御する(証明書の無効化・カスタム CA・カスタムコールバック) - カスタム証明書検証コールバックを使う(`set_server_certificate_verifier`) - SSL/TLS サーバーを立ち上げる(証明書・秘密鍵の設定) - mTLS(クライアント証明書による相互認証)を設定する - サーバー側でピア証明書を参照する(`req.peer_cert()` / SNI) ## SSE - SSE サーバーを実装する - SSE でイベント名を使い分ける - SSE の再接続を処理する(`Last-Event-ID`) - SSE をクライアントで受信する ## WebSocket - WebSocket エコーサーバー/クライアントを実装する - ハートビートを設定する(`set_websocket_ping_interval` / `CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND`) - 接続クローズをハンドリングする - バイナリフレームを送受信する