§HTTP リクエストハンドラ
Playは、リクエストをアクションにルーティングするためのさまざまな抽象化を提供し、ルーターとフィルタを提供して、最も一般的なニーズに対応します。しかし、アプリケーションによっては、Playの抽象化では対応できない高度なニーズが発生する場合があります。このような場合、アプリケーションはPlayの最下位レベルのHTTPパイプラインAPIであるHttpRequestHandler
のカスタム実装を提供できます。
カスタムHttpRequestHandler
の提供は、最後の手段とする必要があります。ほとんどのカスタムニーズは、カスタムルーターまたはフィルタを実装することで満たすことができます。
§カスタムリクエストハンドラの実装
HttpRequestHandler
トレイトには、実装する必要があるメソッドが1つあります。それは、handlerForRequest
です。これは、ハンドラを取得するリクエストを受け取り、RequestHeader
とHandler
のタプルを返します。
リクエストヘッダーが返される理由は、ルーティング情報など、リクエストに情報を追加できるためです。このように、ルーターは、どのルートがリクエストに一致したかなどのルーティング情報でリクエストにタグを付けることができます。これは、監視や横断的な機能の注入に役立ちます。
単純にルーターに委任するだけの非常にシンプルなリクエストハンドラは、次のようになります。
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.conf
でplay.http.requestHandler
構成プロパティを構成することで、これを行うことができます。
play.http.requestHandler = "com.example.RequestHandler"
次: 必須アクション
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。