Documentation

§HTTP リクエストハンドラ

Play は、多くの一般的な要求を満たすためのルータとフィルタを提供することで、リクエストをアクションにルーティングするためのさまざまな抽象化を提供します。しかし、アプリケーションによっては、Play の抽象化では満たされない、より高度なものを要求する場合もあります。この場合、アプリケーションは Play のもっとも低レベルな HTTP パイプライン API である HttpRequestHandler の独自実装を提供できます。

独自の HttpRequestHandler の提供は、最後の手段にするべきです。特別な要求の多くは、独自のルータや filter を実装することで満たせます。

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

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) 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 play.api.http._
import play.api.mvc.RequestHeader

class VirtualHostRequestHandler @Inject() (errorHandler: HttpErrorHandler,
    configuration: HttpConfiguration, filters: HttpFilters,
    fooRouter: foo.Routes, barRouter: bar.Routes
  ) extends DefaultHttpRequestHandler(
    fooRouter, errorHandler, configuration, filters
  ) {

  override def routeRequest(request: RequestHeader) = {
    request.host match {
      case "foo.example.com" => fooRouter.routes.lift(request)
      case "bar.example.com" => barRouter.routes.lift(request)
      case _ => super.routeRequest(request)
    }
  }
}

§HTTP リクエストハンドラの設定

HttpRequestHandler を実装する RequestHandler と呼ばれるクラスをルートパッケージに作成することで、カスタム HTTP ハンドラを提供できます。

リクエストハンドラをルートパッケージに配置したくない場合や、異なる環境に対して異なるリクエストハンドラを設定したい場合は、application.confplay.http.requestHandler プロパティを設定します。

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

§パフォーマンスメモ

何も設定されていない場合に Play が使用する HTTP リクエストハンドラは、従来の GlobalSettings メソッドに委譲するものです。これは、アプリケーションがひとつのリクエストを処理する際に、Guice を用いずに多くの検索を行わなければならないことを意味するため、パフォーマンスに影響を与える可能性があります。Global オブジェクトを使用していない場合、これは必要ありません。代わりに、デフォルト HTTP リクエストハンドラを使用するように Play を設定することができます。

play.http.requestHandler = "play.api.http.DefaultHttpRequestHandler"

Next: 依存性の注入


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。