我正在使用scala 2.0.2 play框架实现web api。我想提取并验证一些get参数。为此,我使用了一个游戏“形式”,它允许我定义可选字段。
问题: 对于那些可选字段,如果未传递参数,我需要定义默认值。 该代码旨在正确解析这三个用例:
我提出了以下代码:
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.")
}
代码有效,但绝对不优雅。为了设置缺少的请求参数的默认值,有很多锅炉板正在进行。
有人能建议更清洁,更巧合的解决方案吗?
答案 0 :(得分:12)
在Play 2.1中
val p = Form( mapping( "top" -> default(number,42) )(CData.apply)(CData.unapply) ).bindFromRequest()
会做你想做的事。
答案 1 :(得分:8)
这是验证查询字符串参数的路由器作业。只需在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")
...
但是通过这样做你会丢失类型检查。当然,您可以为每种类型定义帮助程序,即getIntParam
,getStringParam
等,但Play已包含安全路由器实现,旨在解决此类问题。我建议你使用路由机制而不是手动检查。