Documentation

You are viewing the documentation for the 2.2.x release series. 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 ルーティング


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