Scala 在Play 2路由中处理自由形式的GET URL参数

Scala 在Play 2路由中处理自由形式的GET URL参数,scala,routing,playframework,playframework-2.1,Scala,Routing,Playframework,Playframework 2.1,假设我有一个操作,可以选择接受两个参数: def foo(name: String, age: Integer) = Action { // name & age can both be null if not passed } 如何设置我的路由文件以使用以下任何调用语法: /foo /foo?name=john /foo?age=18 /foo?name=john&age=18 /foo?authCode=bar&name=john&age=18

假设我有一个操作,可以选择接受两个参数:

def foo(name: String, age: Integer) = Action { 
  // name & age can both be null if not passed
}
如何设置我的
路由
文件以使用以下任何调用语法:

/foo
/foo?name=john
/foo?age=18
/foo?name=john&age=18
/foo?authCode=bar&name=john&age=18    // The controller may have other implicit parameters

这句话的正确语法是什么?

类似的东西应该可以:

GET  /foo         controllers.MyController.foo(name: String ?= "", age: Int ?= 0)
由于可以不使用参数,因此需要为其提供默认值(并在控制器函数中处理这些值)

如果传入隐式请求并访问getQueryString参数(我认为是在Play 2.1.0中添加的),则应该能够访问控制器中的其他可选参数:

一个更好的方法可能是从控制器参数中去掉您的可选名称和年龄,并从查询字符串中提取所有内容:

def foo = Action { implicit request =>
    val nameOpt: Option[String] = request.getQueryString("name")
    val ageOpt: Option[String] = request.getQueryString("age")
    ...
}
更新:2.1.1版的版本对此有点不合适(因为问题#776已修复),但这是另一个(也是最好的,IMHO)选项:

而且

def foo(name: Option[String], age: Option[Int]) = Action { implicit request =>
    Ok(s"Name is: $name, age is $age")
}
非常相关
GET  /foo    controllers.MyController.foo(name: Option[String], age: Option[Int])
def foo(name: Option[String], age: Option[Int]) = Action { implicit request =>
    Ok(s"Name is: $name, age is $age")
}