§アクション、コントローラ、および結果
§アクションとは何ですか?
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ルーティング
このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。 ドキュメントガイドラインをお読みになった後、遠慮なくプルリクエストを送信してください。質問や共有したいアドバイスはありますか? コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。