class Ctrl extends Controller {
def action1(parameter: Option[Boolean]) = Action.async { implicit request =>
...
def action2(parameter: Option[Boolean]) = Action.async { implicit request =>
...
}是否有一种方法可以指定例如,这个Ctrl中定义的所有Ctrl都可以处理可选的查询parameter
发布于 2016-09-26 15:51:31
只需从每个操作的查询字符串中读取它:
request.queryString.get("param1").flatMap(_.headOption)或者创建一个函数来读取它:
class ApplicationController extends ... {
...
// define it once in the controller (or in a trait that the controller extends)
def param1 (implicit r: RequestHeader): Option[String] =
request.queryString.get("param1").flatMap(_.headOption)
...
def action1 () = Action.async {implicit request =>
// use it here now
param1 // Option[String]
...
}
}发布于 2016-09-26 15:43:34
是的,你可以用
req.queryString.get(name).flatMap(_.headOption)在每个操作中使用name获取查询参数,并根据可选参数创建一个输出。但是这种方法的问题是代码重复。你必须在每一个行动中做到这一点。
有一种方法可以使用Action组合来做到这一点,而不需要重复代码。创建自定义操作,从请求的queryParams读取所需的参数。现在,您可以使用自定义操作获得对Option[String]的访问,如果用户在请求url中发送了它,则为param。
QueryPramAction.scala
trait QueryParamAction {
self: Controller =>
def withQueryParamAction(f: Option[String] => Request[AnyContent] => Future[Result], name: String = "param") = Action.async { req =>
f(req.queryString.get(name).flatMap(_.headOption))(req)
}
}ApplicationController.scala
class ApplicationController @Inject() () extends Controller with QueryParamAction {
def doStuff = withQueryParamAction { paramOpt => req =>
Future.successful(Ok(s"got a param $paramOpt"))
}
}路线
GET /dostuff controllers.ApplicationController.doStuff请求
http://localhost:9000/dostuff?param=hello输出
got a param Some(hello)如果您不需要一个选项,如果每次都需要一个param,那么更改CustomParamAction特性的实现,如下所示
trait QueryParamAction {
self: Controller =>
def withQueryParam(f: String => Request[AnyContent] => Future[Result], name: String = "param") = Action.async { req =>
req.queryString.get(name).flatMap(_.headOption).map(f(_)(req)).getOrElse(Future.successful(BadRequest(s"need a param with name: $name")))
}
}现在,如果您不发送url中的param,您将得到BadRequest。
https://stackoverflow.com/questions/39706698
复制相似问题