它实际上并不那么神奇(至少在这种情况下)。控制器接收请求并产生响应。在 Play 中,如果您不需要访问或使用任何请求信息,您可以这样写:
def index = Action {
Ok("hello, world") // Not using the request!
}
但是您编写的代码(截至目前)实际上不会编译,因为正如您所说,没有给出请求。相反,您需要这样做:
def index = Action { request =>
Ok("Got request [" + request + "]")
}
即请求是返回a Result
(the Ok
) 的函数的参数。
是的,你是对的,它相当于写:
def index = Action.apply({ request =>
Ok("Got request [" + request + "]")
})
或者更明确地说:
def myAction[T]: (Request[T] => Result) = request => Ok("Got request [" + request + "]")
def index = Action.apply(myAction)
index
不是直接返回响应的函数。它是框架调用以获取请求处理程序的函数(Action
)。然后可以使用传入请求调用该处理程序以产生响应。
还有其他变化。默认情况下,请求的内容(即正文)作为通用处理AnyContent
。如果您想以某种特定方式显式解析正文,例如作为 JSON,您可以将 aBodyParser
作为第一个(curried)参数传递:
def index = Action(myBodyParser) { request =>
Ok("Got request [" + request + "]")
}
注意:使请求成为隐式参数是很常见的,例如,它会自动传递给模板:
def index = Action { implicit request =>
Ok(views.html.mypage())
}
对于一些模板代码,例如:
@()(implicit request: RequestHeader)
<h1>I was called at @request.path</h1>