§アクション、コントローラ、レスポンス
§アクションとは?
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 + "]")
}
パラメータ request
に implicit
を指定して、リクエストを暗黙的な引数として他の API に渡すテクニックは覚えておくと役立つことがあります。
Action { implicit request =>
Ok("Got request [" + request + "]")
}
アクションを生成する最後の方法は、他の引数に加えて BodyParser
を指定するというものです。
Action(parse.json) { implicit request =>
Ok("Got request [" + request + "]")
}
Body parser については後ほど説明します。今は、これまで説明してきたアクション生成用のヘルパーメソッドが、デフォルトで Any content body parser を使用することを知っていれば充分です。
§コントローラとアクションジェネレータ
Controller
は Action
を生成する、ただのシングルトンオブジェクトです。
アクションジェネレータを定義する最もシンプルな方法は、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!")
)
}
もちろん、これまでの例でお見せした 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", status = MOVED_PERMANENTLY)
}
§“TODO” ダミーページ
TODO
という、空の Action
実装を利用することができます。このアクションのレスポンスは、Play 標準の ‘Not implemented yet’ ページです。
def index(name:String) = TODO
次ページ: HTTP ルーティング