2013-04-30 59 views
8

处理自由获取URL参数,比方说我有选择性地接受两个参数的作用:在播放2路由

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 

这是什么正确的语法?

+0

与HTTP有很大关系://计算器.COM /问题/ 9657163 /如何到手柄可选查询参数,在播放框架 – 2014-07-07 16:46:16

回答

17

像这样的东西应该工作:

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

由于您的参数可以离开你需要为他们提供默认值(和控制器功能处理这些值)。

您应该能够访问其他可选参数的控制,如果你传递一个隐含的请求和访问getQueryString参数(在播放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") 
    ... 
} 

更新:本current docs为2.1.1是有点˚F这个(因为固定与问题#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") 
}