rip*_*234 9 routing scala playframework playframework-2.1
假设我有一个可选择接受两个参数的动作:
def foo(name: String, age: Integer) = Action {
// name & age can both be null if not passed
}
Run Code Online (Sandbox Code Playgroud)
如何设置我的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
Run Code Online (Sandbox Code Playgroud)
这个的正确语法是什么?
Mik*_*ame 18
这样的事情应该有效:
GET /foo controllers.MyController.foo(name: String ?= "", age: Int ?= 0)
Run Code Online (Sandbox Code Playgroud)
由于您的参数可以保留,您需要为它们提供默认值(并在控制器函数中处理这些值).
如果传入隐式请求并访问getQueryString参数(我认为在Play 2.1.0中添加),您应该能够访问控制器中的其他可选参数:
def foo(name: String, age: Integer) = Action { implicit request =>
val authCode: Option[String] = request.getQueryString("authCode")
...
}
Run Code Online (Sandbox Code Playgroud)
一个更好的方法可能只是从控制器参数中取出可选名称和年龄,并从queryString中提取所有内容:
def foo = Action { implicit request =>
val nameOpt: Option[String] = request.getQueryString("name")
val ageOpt: Option[String] = request.getQueryString("age")
...
}
Run Code Online (Sandbox Code Playgroud)
更新:2.1.1 的当前文档有点关闭(自问题#776修复)但这是另一个(和最好的,恕我直言)选项:
GET /foo controllers.MyController.foo(name: Option[String], age: Option[Int])
Run Code Online (Sandbox Code Playgroud)
和...
def foo(name: Option[String], age: Option[Int]) = Action { implicit request =>
Ok(s"Name is: $name, age is $age")
}
Run Code Online (Sandbox Code Playgroud)