Documentation

§アクション、コントローラ、レスポンス

§アクションとは?

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

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

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

アクションは play.api.mvc.Result 型の値を返し、これはクライアントへ送信される HTTP レスポンスを表しています。上記の例では、Ok は コンテントタイプ text/plain のレスポンスボディを含む、 ステータス 200 OK のレスポンスを生成します。

§アクションの定義

コンパニオンオブジェクト play.api.mvc.Action には、アクションの生成に役立ついくつかのヘルパーメソッドが用意されています。

まず、最もシンプルなヘルパーメソッドは Result 型の値を返すブロック式をひとつ引数に取ります。

Action {
  Ok("Hello world")
}

これはアクションを作成する最も簡単な方法ですが、受け取ったリクエストへの参照が得られていません。多くの場合、このアクションを呼び出した HTTP リクエストにアクセスできると便利です。

そのため、Request => Result 型の関数を引数に取る別のアクションビルダが用意されています。

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

パラメータ requestimplicit を指定して、リクエストを暗黙的な引数として他の API に渡すテクニックは覚えておくと役立つことがあります。

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

アクションを生成する最後の方法は、他の引数に加えて BodyParser を指定するというものです。

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

Body parser については後ほど説明します。今は、これまで説明してきたアクション生成用のヘルパーメソッドが、デフォルトで Any content body parser を使用することを知っていれば充分です。

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

ControllerAction を生成する、ただのシングルトンオブジェクトです。

アクションジェネレータを定義する最もシンプルな方法は、Action 型の値を返す引数なしのメソッドを定義するというものです。

package controllers

import play.api.mvc._

class Application extends Controller {

  def index = Action {
    Ok("It works!")
  }

}

もちろん、アクションジェネレータは引数を取ることができますし、その引数は Action のクロージャが捕捉することができます。

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

§シンプルな Result

次は、シンプルな Result に注目してみましょう。Result とは、web クライアントへ送信される HTTP レスポンスを表すオブジェクトで、ステータスコードとレスポンスヘッダ一式、メッセージボディをまとめたものです。

これらの Result は play.api.mvc.Result として定義されています:

def index = Action {
  Result(
    header = ResponseHeader(200, Map(CONTENT_TYPE -> "text/plain")),
    body = Enumerator("Hello world!".getBytes())
  )
}

もちろん、これまでの例でお見せした Ok のように、よく使われるレスポンスを生成するヘルパーが用意されています。

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

このコードは、一つ前のサンプルと同じ Result を生成します。

Result を生成する例をいくつかご紹介します。

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 トレイトまたはコンパニオンオブジェクトで定義されています。

§リダイレクトもシンプルな Result

ブラウザを新しい URL へリダイレクトさせることもシンプルな Result の一種です。ただし、リダイレクトの Result はレスポンスボディを取りません。

リダイレクトを生成するヘルパーもいくつか用意されています。

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

デフォルトでは、303 SEE_OTHER のステータスコードが使われますが、必要に応じて別のステータスコードを指定することもできます。

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

§TODO ダミーページ

TODO という、空の Action 実装を利用することができます。このアクションのレスポンスは、Play 標準の ‘Not implemented yet’ ページです。

def index(name:String) = TODO

Next: HTTP ルーティング


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