Requestハンドラ
リクエストハンドラは、リクエストから抽出できる0個以上のパラメータを受け取り(impl FromRequestなど)、HttpResponseに変換できる型を返す(impl Responderなど)非同期関数である。
リクエスト処理は2段階で行われます。まず、ハンドラオブジェクトが呼び出され、Responderトレイトを実装した任意のオブジェクトを返します。次に、返されたオブジェクトに対してrespond_to()
が呼び出され、それ自身がHttpResponse
または Error
に変換されます。
デフォルトでは、actix-web は&'static str
やString
などの標準的な型のResponder
の実装を提供します。
完全な実装のリストは、Responder documentation をご参照ください。
ハンドラーのサンプルコード:
async fn index(_req: HttpRequest) -> &'static str {
"Hello world!"
}
async fn index(_req: HttpRequest) -> String {
"Hello world!".to_owned()
}
また、より複雑な型が含まれる場合、有効なimpl Responder
を返すようにシグネチャを変更することも可能です。
async fn index(_req: HttpRequest) -> impl Responder {
web::Bytes::from_static(b"Hello world!")
}
async fn index(req: HttpRequest) -> Box<Future<Item=HttpResponse, Error=Error>> {
...
}
カスタムデータ型のレスポンス
カスタムデータ型をハンドラ関数から直接返すには、Responder
トレイトを実装する必要があります。
application/json
レスポンスにシリアライズする、カスタムデータ型のレスポンスを作成してみましょう。
レスポンスボディ(response body)のストリーミング
レスポンスボディは非同期に生成することができます。
この場合、ボディはStream<Item=Bytes, Error=Error>
というStreamトレイトを実装する必要があります。
サンプルコード:
異なる型の返却(Either型)
時には、異なる型のレスポンスを返す必要があります。例えば、エラーチェックをしてエラーを返したり、非同期レスポンスを返したり、2つの異なる型を必要とする場合などがあります。
この場合、Either型
を使用することができます。Either型は、2 つの異なるレスポンダ型を 1 つの型に統合することができます。