ディレクティブ

ディレクティブ

"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