Scala 如何在play framework窗体中定义默认值可选字段?

Scala 如何在play framework窗体中定义默认值可选字段?,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我正在使用scala 2.0.2 play框架实现一个web api。我想提取并验证一些get参数。为此,我使用了一个play“form”,它允许我定义可选字段 问题: 对于这些可选字段,如果未传递参数,我需要定义一个默认值。 代码旨在正确解析这三个用例: /测试?top=abc(错误,abc不是整数) /测试?top=123(有效,top为123) /测试(有效,顶部为42(默认值)) 我想出了以下代码: def test = Action { implicit request =&g

我正在使用scala 2.0.2 play框架实现一个web api。我想提取并验证一些get参数。为此,我使用了一个play“form”,它允许我定义可选字段

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

  • /测试?top=abc(错误,abc不是整数)
  • /测试?top=123(有效,top为123)
  • /测试(有效,顶部为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.")
}
代码可以工作,但绝对不优雅。有很多boiler plate正在为缺少的请求参数设置默认值


有人能推荐一个更干净、更精确的解决方案吗?

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

GET /test controllers.Application.test(top: Int ?= 42)
并将
top
作为参数添加到控制器方法中:

def test(top: Int) = Action {
  // Use top here
  val data = CData(top)
}
def getQueryParam(key: String, default: String)(implicit request: RequestHeader) =
  request.queryString.get(key).flatMap(_.headOption).getOrElse(default)
然后,玩游戏,为您完成所有验证工作。注意如何使用
?=
语法指定默认值

您应该仅对POST请求使用表单

更新:

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

def test(top: Int) = Action {
  // Use top here
  val data = CData(top)
}
def getQueryParam(key: String, default: String)(implicit request: RequestHeader) =
  request.queryString.get(key).flatMap(_.headOption).getOrElse(default)
并在控制器方法中使用它:

def test = Action { implicit request =>
  val top = getQueryParam("top", "42")
  ...
但这样做会丢失类型检查。当然,您可以为每种类型定义帮助程序,即
getIntParam
getStringParam
等等,但Play已经包含了安全路由器实现,旨在解决此类问题。我建议您使用路由机制,而不是手动检查。

在游戏2.1中

val p = Form( mapping( "top" -> default(number,42) )(CData.apply)(CData.unapply) ).bindFromRequest() val p=形式( 映射( “顶部”->默认值(数字,42) )(CData.apply)(CData.unapply) ).bindFromRequest()
您想做什么就做什么。

这是一个很好的解决方案。不幸的是,此解决方案的唯一缺点是,它不能很好地与大量默认参数一起扩展。当您构建必须支持列表筛选的web服务/web应用程序时,公开路由中的所有默认参数会降低代码的可读性和健壮性。在所有其他场景中,这确实是首选的解决方案。您可能会发现,使用帮助器方法实现更新后的Answer非常有用。我建议对play框架进行扩展,以编程一种关于默认参数的更为代码驱动的方法。看见