9

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

def foo(name: String, age: Integer) = Action { 
  // name & age can both be null if not passed
}

如何设置我的route文件以使用以下任何调用语法:

/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

什么是正确的语法?

4

1 回答 1

18

像这样的东西应该工作:

GET  /foo         controllers.MyController.foo(name: String ?= "", age: Int ?= 0)

由于您的参数可以省略,您需要为它们提供默认值(并在控制器函数中处理这些值)。

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

def foo(name: String, age: Integer) = Action { implicit request =>
   val authCode: Option[String] = request.getQueryString("authCode")
   ...
}

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

def foo = Action { implicit request =>
    val nameOpt: Option[String] = request.getQueryString("name")
    val ageOpt: Option[String] = request.getQueryString("age")
    ...
}

更新: 2.1.1 的当前文档对此有点偏离(自问题 #776 修复以来),但这是另一个(也是最好的,恕我直言)选项:

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")
}
于 2013-04-30T14:39:44.833 回答