メインコンテンツまでスキップ

Requestハンドラ

リクエストハンドラは、リクエストから抽出できる0個以上のパラメータを受け取り(impl FromRequestなど)、HttpResponseに変換できる型を返す(impl Responderなど)非同期関数である。

リクエスト処理は2段階で行われます。まず、ハンドラオブジェクトが呼び出され、Responderトレイトを実装した任意のオブジェクトを返します。次に、返されたオブジェクトに対してrespond_to()が呼び出され、それ自身がHttpResponseまたは Errorに変換されます。

デフォルトでは、actix-web は&'static strStringなどの標準的な型の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 つの型に統合することができます。