首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一种方法可以在Controller中的操作定义期间不显式地将可选查询参数添加到所选(或所有)操作

是否有一种方法可以在Controller中的操作定义期间不显式地将可选查询参数添加到所选(或所有)操作
EN

Stack Overflow用户
提问于 2016-09-26 15:25:59
回答 2查看 94关注 0票数 0
代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-26 15:51:31

只需从每个操作的查询字符串中读取它:

代码语言:javascript
复制
request.queryString.get("param1").flatMap(_.headOption)

或者创建一个函数来读取它:

代码语言:javascript
复制
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]

     ...
   }
}
票数 1
EN

Stack Overflow用户

发布于 2016-09-26 15:43:34

是的,你可以用

代码语言:javascript
复制
req.queryString.get(name).flatMap(_.headOption)

在每个操作中使用name获取查询参数,并根据可选参数创建一个输出。但是这种方法的问题是代码重复。你必须在每一个行动中做到这一点。

有一种方法可以使用Action组合来做到这一点,而不需要重复代码。创建自定义操作,从请求的queryParams读取所需的参数。现在,您可以使用自定义操作获得对Option[String]的访问,如果用户在请求url中发送了它,则为param。

QueryPramAction.scala

代码语言:javascript
复制
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

代码语言:javascript
复制
class ApplicationController @Inject() () extends Controller with QueryParamAction {

  def doStuff = withQueryParamAction { paramOpt => req =>
    Future.successful(Ok(s"got a param $paramOpt"))
  }

}

路线

代码语言:javascript
复制
GET   /dostuff   controllers.ApplicationController.doStuff

请求

代码语言:javascript
复制
http://localhost:9000/dostuff?param=hello

输出

代码语言:javascript
复制
got a param Some(hello)

如果您不需要一个选项,如果每次都需要一个param,那么更改CustomParamAction特性的实现,如下所示

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39706698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档