ScalaActions - opensas/Play20Es GitHub Wiki
La mayoría de los request recibidos por una aplicación Play son atendidos por un Action.
Un play.api.mvc.Action básicamente es una función (play.api.mvc.Request => play.api.mvc.Result) que procesa las solicitudes HTTP, y produce un resultado para enviar al cliente.
val echo = Action { request =>
Ok("Got request [" + request + "]")
}Un Action devuelve un valor play.api.mvc.Result, representando la respuesta HTTP para enviar al cliente web. En este ejemplo Ok genera una respuesta 200 OK con un body con respuesta de tipo text/plain.
El companion object play.api.mvc.Action ofrece varios métodos que le permitirán generar un Action.
El más simple de ellos toma como argumento un bloque de código y retorna un Result:
Action {
Ok("Hello world")
}Esta es la manera más simple de crear un Action, pero en este caso carecemos de una referencia al pedido HTTP entrante. A menudo es útil acceder al pedido HTTP que está llamando al Action.
De manera que hay otro constructor de Actions que toma como parámetro una función de la forma Request => Result:
Action { request =>
Ok("Got request [" + request + "]")
}Suele ser útil markar el parámetro request como implicitde manera que pueda ser implícitamente usado por otras APIs que lo necesiten:
Action { implicit request =>
Ok("Got request [" + request + "]")
}Por último, también puede crear un Action especificando un parámetro adicional de tipo BodyParser:
Action(parse.json) { implicit request =>
Ok("Got request [" + request + "]")
}Los Body parsers serán abordados más adelante en este manual. Por el momento sólo necesita saber que los demás métodos para crear Actions utilizan por defecto un Body parsers preparado para lidiar con cualquier tipo de contenido (un Any content body parser).
Un Controller no es más que un objeto Singleton que genera valores de tipo Action.
La manera más simple de definir un generador de Actions es un método sin parámetros que retorne un valor de tipo Action:
package controllers
import play.api.mvc._
object Application extends Controller {
def index = Action {
Ok("It works!")
}
}Por supuesto, el método encardado de generar el Action puede tener parámetros, y estos parámetros serán accesibles desde el closure del Action:
def hello(name: String) = Action {
Ok("Hello " + name)
}Empecemos con un resultado simple: un resultado HTTP con código de estado, un conjunto de encabezados HTTP y el body para enviar al cliente web..
Estos resultados están definidos en play.api.mvc.SimpleResult:
def index = Action {
SimpleResult(
header = ResponseHeader(200, Map(CONTENT_TYPE -> "text/plain")),
body = Enumerator("Hello world!")
)
}Por supuesto, existen varias funciones que nos permite crear los resultados de uso más habitual, como el resultado Ok del ejemplo anterior:
def index = Action {
Ok("Hello world!")
}Esto produce exactamente el mismo resultado que el ejemplo anterior.
Aquí tenemos varios ejemplos que devuelven distintos resultados:
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")A todos ellos los podemos encontrar en el trait play.api.mvc.Results y su companion object.
Redireccionar el browser a otra URL es solo otro tipo de resultado simple. Sin embargo, esos tipos de resultados no tienen un cuerpo de respuesta.
Hay varias funciones que nos ayudan a crear results de tipo redirect:
def index = Action {
Redirect("/user/home")
}Por defecto estos results retornarán una respuesta de tipo 303 SEE_OTHER, pero también puedes especificar un código más específico:
def index = Action {
Redirect("/user/home", status = MOVED_PERMANENTLY)
}También puede utilizar la implementación de un Action vacío definido como TODO (sin implementar): el resultado es una página estándar con el mensaje ‘Sin implementar aún’ :
def index(name:String) = TODOPróximos pasos: Rutas HTTP