6

我正在使用 scala 2.0.2 播放框架实现一个 web api。我想提取并验证一些获取参数。为此,我使用了一个允许我定义可选字段的播放“表单”。

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

  • /test?top=abc(错误,abc 不是整数)
  • /test?top=123(有效,top 为 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.")
}

代码有效,但绝对不优雅。有很多样板只是为了为缺少的请求参数设置默认值。

任何人都可以提出一个更清洁、更简洁的解决方案吗?

4

2 回答 2

12

在玩 2.1

val p = 形式(
    映射(
      “顶部”-> 默认(数字,42)
    )(CData.apply)(CData.unapply)
  ).bindFromRequest()

会做你想做的。

于 2012-12-04T09:30:26.200 回答
9

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

GET /test controllers.Application.test(top: Int ?= 42)

top作为参数添加到您的控制器方法中:

def test(top: Int) = Action {
  // Use top here
  val data = CData(top)
}

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

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

更新:

如果你想手动检查参数,那么你可以定义辅助方法:

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")
  ...

但是这样做会丢失类型检查。当然,您可以为每种类型定义帮助器,例如getIntParamgetStringParam等等,但 Play 已经包含安全路由器实现,旨在解决此类问题。我建议您使用路由机制而不是手动检查。

于 2012-07-08T10:41:34.940 回答