如何在播放框架表单中定义默认值可选字段?

nat*_*usa 6 scala playframework playframework-2.0

我正在使用scala 2.0.2 play框架实现web api.我想提取并验证一些get参数.为此,我使用了一个游戏"形式",它允许我定义可选字段.

问题:对于那些可选字段,如果未传递参数,我需要定义默认值.该代码旨在正确解析这三个用例:

  • / test?top = abc(错误,abc不是整数)
  • / test?top = 123(有效,顶部是123)
  • / test(有效,top是42(默认值))

我想出了以下代码:

def test = Action {
  implicit request =>

  case class CData(top:Int)

  val p = Form(
    mapping(
      "top" -> optional(number)
    )((top) => CData($top.getOrElse(42))) ((cdata:CData) => Some(Some(cdata.top)))
  ).bindFromRequest()

  Ok("all done.")
}
Run Code Online (Sandbox Code Playgroud)

代码有效,但绝对不优雅.为了设置缺少的请求参数的默认值,有很多锅炉板正在进行.

谁能建议一个更清洁,更巧合的解决方案?

rss*_*ssh 12

在Play 2.1中

val p = Form(
    mapping(
      "top" -> default(number,42)
    )(CData.apply)(CData.unapply)
  ).bindFromRequest()

会做你想做的.


lam*_*das 8

这是验证查询字符串参数的路由器作业.只需在routes文件中定义您的参数:

GET /test controllers.Application.test(top: Int ?= 42)
Run Code Online (Sandbox Code Playgroud)

并添加top为控制器方法的参数:

def test(top: Int) = Action {
  // Use top here
  val data = CData(top)
}
Run Code Online (Sandbox Code Playgroud)

然后,Play为您完成所有验证工作.请注意如何使用?=语法指定默认值.

您应该仅将表单用于POST请求.

更新:

如果您希望手动检查参数,则可以定义辅助方法:

def getQueryParam(key: String, default: String)(implicit request: RequestHeader) =
  request.queryString.get(key).flatMap(_.headOption).getOrElse(default)
Run Code Online (Sandbox Code Playgroud)

并在您的控制器方法中使用它:

def test = Action { implicit request =>
  val top = getQueryParam("top", "42")
  ...
Run Code Online (Sandbox Code Playgroud)

但通过这样做,你会失去类型检查.当然,你可以定义助手为每种类型的,即getIntParam,getStringParam等等,但播放已经包含了安全路由器的实施,旨在解决这样那样的问题.我建议你使用路由机制而不是手动检查.