ディレクティブ
"Directive" は、任意の複雑な route structures を作成するのに使われる小さなブロックです。Akka HTTPは予め数多くのディレクティブを定義しています。あなた自身で構築することも簡単に出来ます。
基本
ルート は RequestContext
を取り、最終的に(場合によっては非同期に) complete
する高度に特殊な関数です。
complete ディレクティブを使うことによって、より簡潔になります:
Route route = complete("yeah");
定義した順に試行される複数のルートを記述する事は、 route(route1, route2)
を使用するのと同じ位簡単です。
Route routes = route(
pathSingleSlash(() ->
getFromResource("web/calculator.html")
),
path("hello", () -> complete("World!))
);
最後にマッチするルートを記述する事によって、 "catch all" なルートも簡単に定義する事ができます。以下の例では、( MethodDirectives の一つである) get()
を使って、全ての GET
リクエストをこのルートにマッチさせ、その他のリクエストを "catch all" に送ってルートを完結させています:
Route route =
get(
() -> complete("Received GET")
).orElse(
() -> complete("Received something else")
)
リクエストにマッチするルートがない場合、デフォルトでは 404 Not Found
がレスポンスとして返されます。
構造
ディレクティブの一般的な分析は次の通りです:
directiveName(arguments [, ...], (extractions [, ...]) -> {
... // inner route
})
それは名前を持ち、ゼロかそれ以上の引数と内部ルートを持ちます。( RouteDirectives は常に末端で使用され、内部ルートを持つことのできない特別なルートです)
加えて、ディレクティブは値を"抽出"し、内部ルートで関数の引数として利用させる事ができます。"外側から"見えるとき、その内側のルートを持つディレクティブは、 Route
型の式を形成します。
ディレクティブの意味
ディレクティブは以下の一つ以上の事が出来ます:
内部ルートを通過する前に、受診した
RequestContext
を変換する(即ち、リクエストを変更します)幾つかのロジックにしたがって、
RequestContext
をフィルタする(即ち、特定のリクエストを通過させ、他のリクエストを拒否する)RequestContext
から値を抽出し、内部ルートで "extractions" として利用できるようにする幾つかのロジックを
RouteResult
の変換チェーンに連結する(即ち、レスポンスもしくはリジェクションを変更する)リクエストの完了
これは Directive
が内部ルートの機能を完全にラップし、リクエスト側とレスポンス側の両方(もしくは一方)に任意の複雑な変換を適用する事が出来ることを意味します。
ディレクティブの作成
TODO Java APIの書き直し
Contents