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

11

假设我有一个可以选用两个参数的操作:

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

这个的正确语法是什么?


非常相关的是https://dev59.com/wWkw5IYBdhLWcg3wx9aC。 - João Antunes
1个回答

19

类似以下这样的代码应该可以正常工作:

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])

And...

def foo(name: Option[String], age: Option[Int]) = Action { implicit request =>
    Ok(s"Name is: $name, age is $age")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接