ドキュメント

§アクション、コントローラ、および結果

§アクションとは何ですか?

Playアプリケーションが受け取るリクエストのほとんどは、Actionによって処理されます。

play.api.mvc.Actionは基本的に、リクエストを処理し、クライアントに送信する結果を生成する(play.api.mvc.Request => play.api.mvc.Result)関数です。

def echo: Action[AnyContent] = Action { request => Ok("Got request [" + request + "]") }

アクションは、Webクライアントに送信するHTTPレスポンスを表すplay.api.mvc.Result値を返します。この例では、Okは、text/plainレスポンスボディを含む200 OKレスポンスを構築します。

§アクションの構築

BaseControllerを拡張する任意のコントローラ内で、Action値はデフォルトのアクションビルダーです。このアクションビルダーには、Actionを作成するためのいくつかのヘルパーが含まれています。

最初の最も簡単なものは、Resultを返す式ブロックを引数として取るだけです。

Action {
  Ok("Hello world")
}

これがActionを作成する最も簡単な方法ですが、受信リクエストへの参照は取得しません。このActionを呼び出すHTTPリクエストにアクセスすると便利な場合がよくあります。

したがって、関数Request => Resultを引数として取る別のアクションビルダーがあります。

Action { request => Ok("Got request [" + request + "]") }

requestパラメーターをimplicitとしてマークすると、それを必要とする他のAPIで暗黙的に使用できると便利な場合がよくあります。

Action { implicit request => Ok("Got request [" + request + "]") }

コードをメソッドに分割した場合、アクションから暗黙的なリクエストを渡すことができます。

def action: Action[AnyContent] = Action { implicit request =>
  anotherMethod("Some para value")
  Ok("Got request [" + request + "]")
}

def anotherMethod(p: String)(implicit request: Request[_]) = {
  // do something that needs access to the request
}

Action値を作成する最後の方法は、追加のBodyParser引数を指定することです。

Action(parse.json) { implicit request => Ok("Got request [" + request + "]") }

ボディパーサーについては、このマニュアルの後半で説明します。今のところ、Action値を作成する他のメソッドは、デフォルトの**任意のコンテンツボディパーサー**を使用することを知っておくだけで十分です。

§コントローラはアクションジェネレータです

Playのコントローラは、Action値を生成するオブジェクトにすぎません。コントローラは通常、依存性注入を利用するためにクラスとして定義されます。

注: コントローラをオブジェクトとして定義することは、Playの将来のバージョンではサポートされないことに注意してください。クラスを使用することをお勧めします。

アクションジェネレータを定義する最も簡単なユースケースは、Action値を返すパラメーターのないメソッドです。

package controllers

  import javax.inject.Inject

  import play.api.mvc._

  class Application @Inject() (cc: ControllerComponents) extends AbstractController(cc) {
    def index = Action {
      Ok("It works!")
    }
  }

もちろん、アクションジェネレータメソッドはパラメーターを持つことができ、これらのパラメーターはActionクロージャによってキャプチャできます。

def hello(name: String) = Action {
  Ok("Hello " + name)
}

§単純な結果

今のところ、単純な結果にのみ関心があります。ステータスコード、HTTPヘッダーのセット、およびWebクライアントに送信されるボディを含むHTTP結果です。

これらの結果は、play.api.mvc.Resultによって定義されます。

import play.api.http.HttpEntity

def index = Action {
  Result(
    header = ResponseHeader(200, Map.empty),
    body = HttpEntity.Strict(ByteString("Hello world!"), Some("text/plain"))
  )
}

もちろん、上記のサンプルでOk結果のような一般的な結果を作成するために利用できるいくつかのヘルパーがあります。

def index = Action {
  Ok("Hello world!")
}

これにより、以前とまったく同じ結果が生成されます。

さまざまな結果を作成するいくつかの例を次に示します。

val ok           = Ok("Hello world!")
val notFound     = NotFound
val pageNotFound = NotFound(<h1>Page not found</h1>)
val badRequest   = BadRequest(views.html.form(formWithErrors))
val oops         = InternalServerError("Oops")
val anyStatus    = Status(488)("Strange response type")

これらのヘルパーはすべて、play.api.mvc.Resultsトレイトおよびコンパニオンオブジェクトにあります。

§リダイレクトも単純な結果です

ブラウザを新しいURLにリダイレクトすることは、別の種類の単純な結果にすぎません。ただし、これらの結果タイプは応答ボディを取りません。

リダイレクト結果を作成するために利用できるいくつかのヘルパーがあります。

def index = Action {
  Redirect("/user/home")
}

デフォルトでは303 SEE_OTHER応答タイプを使用しますが、必要に応じて、より具体的なステータスコードを設定することもできます。

def index = Action {
  Redirect("/user/home", MOVED_PERMANENTLY)
}

§TODOダミーページ

TODOとして定義された空のAction実装を使用できます。結果は標準の「まだ実装されていません」の結果ページになります。

def index(name: String) = TODO

次へ: HTTPルーティング


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