ドキュメント

§HTTP リクエストハンドラ

Playは、リクエストをアクションにルーティングするためのさまざまな抽象化を提供し、ルーターとフィルタを提供して、最も一般的なニーズに対応します。しかし、アプリケーションによっては、Playの抽象化では対応できない高度なニーズが発生する場合があります。このような場合、アプリケーションはPlayの最下位レベルのHTTPパイプラインAPIであるHttpRequestHandlerのカスタム実装を提供できます。

カスタムHttpRequestHandlerの提供は、最後の手段とする必要があります。ほとんどのカスタムニーズは、カスタムルーターまたはフィルタを実装することで満たすことができます。

§カスタムリクエストハンドラの実装

HttpRequestHandlerトレイトには、実装する必要があるメソッドが1つあります。それは、handlerForRequestです。これは、ハンドラを取得するリクエストを受け取り、RequestHeaderHandlerのタプルを返します。

リクエストヘッダーが返される理由は、ルーティング情報など、リクエストに情報を追加できるためです。このように、ルーターは、どのルートがリクエストに一致したかなどのルーティング情報でリクエストにタグを付けることができます。これは、監視や横断的な機能の注入に役立ちます。

単純にルーターに委任するだけの非常にシンプルなリクエストハンドラは、次のようになります。

import javax.inject.Inject

import play.api.http._
import play.api.mvc._
import play.api.routing.Router

class SimpleHttpRequestHandler @Inject() (router: Router, action: DefaultActionBuilder) extends HttpRequestHandler {
  def handlerForRequest(request: RequestHeader) = {
    router.routes.lift(request) match {
      case Some(handler) => (request, handler)
      case None          => (request, action(Results.NotFound))
    }
  }
}

§デフォルトのリクエストハンドラの拡張

ほとんどの場合、リクエストハンドラを最初から作成するのではなく、デフォルトのリクエストハンドラを基に構築するでしょう。DefaultHttpRequestHandlerを拡張することで、これを行うことができます。デフォルトのリクエストハンドラは、オーバーライドできる多くのメソッドを提供します。これにより、リクエストにタグを付けたり、エラーを処理したりするコードを再実装することなく、カスタム機能を実装できます。

カスタムリクエストハンドラのユースケースの1つは、リクエストのホストに応じて、異なるルーターに委任する場合です。これがどのように行われるかの例を次に示します。

import javax.inject.Inject
import javax.inject.Provider

import play.api.http._
import play.api.mvc.RequestHeader

class VirtualHostRequestHandler @Inject() (
    webCommands: WebCommands,
    optionalDevContext: OptionalDevContext,
    errorHandler: HttpErrorHandler,
    configuration: HttpConfiguration,
    filters: HttpFilters,
    fooRouter: Provider[foo.Routes],
    barRouter: Provider[bar.Routes]
) extends DefaultHttpRequestHandler(
      webCommands,
      optionalDevContext,
      fooRouter,
      errorHandler,
      configuration,
      filters
    ) {
  override def routeRequest(request: RequestHeader): Option[Handler] = {
    request.host match {
      case "foo.example.com" => fooRouter.get.routes.lift(request)
      case "bar.example.com" => barRouter.get.routes.lift(request)
      case _                 => super.routeRequest(request)
    }
  }
}

§HTTPリクエストハンドラの構成

アプリケーションの構築にBuiltInComponentsを使用している場合は、httpRequestHandlerメソッドをオーバーライドして、カスタムハンドラのインスタンスを返します。

ランタイム依存性注入(Guiceなど)を使用している場合、リクエストハンドラはランタイムに動的にロードできます。最も簡単な方法は、HttpRequestHandlerを実装するRequestHandlerというクラスをルートパッケージに作成することです。

リクエストハンドラをルートパッケージに配置したくない場合、または異なる環境で異なるリクエストハンドラを構成できるようにしたい場合は、application.confplay.http.requestHandler構成プロパティを構成することで、これを行うことができます。

play.http.requestHandler = "com.example.RequestHandler"

次: 必須アクション


このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。