Response

Handler 内では、Response が引数として渡されます:

  • Response 構造体は HTTP レスポンスの全要素をカプセル化し、HTTP レスポンスを構築・操作するための完全な API を提供します。
  • チェーンメソッド呼び出しスタイル(例:res.status_code(200).body("Hello"))をサポートし、レスポンスを流暢に構築できます。
  • 主な機能:
    • ステータスコードとヘッダーの設定
    • レスポンスボディの操作(文字列、バイト、ファイル、ストリーミングデータをサポート)
    • Cookie の管理
    • 多様なコンテンツレンダリング方法
  • この構造体は可変参照モードを採用し、&mut self を通じて自身の参照を返すため、ハンドラは HTTP レスポンスを簡単に構築・カスタマイズし、様々な Web サービス要件を満たすことができます。
#[handler]
async fn hello_world(res: &mut Response) {
    res.render("Hello world!");
}

サーバーがクライアントリクエストを受信した後、Response には、一致したすべての Handler とミドルウェアがデータを書き込むことができます。特定の状況では、例えばあるミドルウェアが後続のミドルウェアや Handler の実行を阻止したい場合、FlowCtrl を使用できます:

#[handler]
async fn hello_world(res: &mut Response, ctrl: &mut FlowCtrl) {
    ctrl.skip_rest();
    res.render("Hello world!");
}

コンテンツの書き込み

Response にデータを書き込むことは非常に簡単です:

  • プレーンテキストデータの書き込み

    res.render("Hello world!");
  • JSON シリアライズデータの書き込み

    use serde::Serialize;
    use salvo::prelude::Json;
    
    #[derive(Serialize, Debug)]
    struct User {
        name: String,
    }
    let user = User{name: "jobs".to_string()};
    res.render(Json(user));
Warning

render メソッドを複数回呼び出して JSON データを書き込む場合、これらのデータは単一の JSON オブジェクトにマージされず、独立したテキストフラグメントとして順番に連結されるため、無効な JSON フォーマットになる可能性があります。複数のデータを返す必要がある場合は、それらを一つのオブジェクトに組み合わせてから一度にシリアライズするか、ロジックを自身で処理する必要があります。

  • HTML の書き込み

    res.render(Text::Html("<html><body>hello</body></html>"));

HTTP エラーの書き込み

  • render を使用して、Response に詳細なエラー情報を書き込むことができます。

    use salvo::http::errors::*;
    res.render(StatusError::internal_server_error().brief("error when serialize object to json"))
  • カスタムエラーメッセージが不要な場合は、直接 set_http_code を呼び出すことができます。

    use salvo::http::StatusCode;
    res.status_code(StatusCode::BAD_REQUEST);

他の URL へのリダイレクト

  • render メソッドを使用して、Response にリダイレクトレスポンスを書き込み、新しい URL にナビゲートすることができます。Redirect::found メソッドを呼び出すと、HTTP ステータスコードが 302(Found)に設定され、一時的なリダイレクトを意味します。
    use salvo::prelude::*;
    
    #[handler]
    async fn redirect(res: &mut Response) {
        res.render(Redirect::found("https://salvo.rs/"));
    }

ResBody

Response が返す Body の型は ResBody です。これは列挙型であり、エラー発生時には ResBody::Error に設定されます。ここにはエラー情報が含まれており、エラーの遅延処理に使用されます。StatusError は実際には Writer を実装しておらず、Catcher で独自の表示方法をカスタマイズできるようにすることを目的としています。

Response 構造体メソッド概要

カテゴリメソッド説明
作成new() / with_cookies()新しいレスポンスを作成
ステータスコードstatus_code()ステータスコードを設定
リクエストヘッダーheaders()/headers_mut()ヘッダーを取得
set_headers()/add_header()ヘッダーを設定/追加
content_type()コンテンツタイプを取得
HTTP バージョンversion()/version_mut()HTTP バージョンを取得/変更
レスポンスボディbody()/body_mut()レスポンスボディを設定/取得
replace_body()/take_body()レスポンスボディを置換/抽出
write_body()レスポンスボディにデータを書き込み
stream()/channel()ストリーミングレスポンス/送信チャネルを作成
Cookie 処理cookies()/cookie()cookies/指定した cookie を取得
add_cookie()/remove_cookie()cookie を追加/削除
コンテンツレスポンスrender()コンテンツをレンダリング
stuff()ステータスコードを設定し、コンテンツをレンダリング
send_file()ファイルを送信
状態確認is_stamped()レスポンスが書き戻し準備完了かどうかを確認