Documentation

You are viewing the documentation for the 2.2.0 release in the 2.2.x series of releases. The latest stable release series is 2.4.x.

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

§アクションとは?

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._

object Application extends Controller {

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

}

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

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

§SimpleResult

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

SimpleResult は play.api.mvc.SimpleResult クラスとして定義されています。

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

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

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

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

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

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

§リダイレクトも SimpleResult

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

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

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

次ページ: HTTP ルーティング