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

标签 scala routing playframework playframework-2.1

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

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

正确的语法是什么?

最佳答案

这样的事情应该起作用:

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

由于可以保留您的参数,因此您需要为其提供默认值(并在 Controller 功能中处理这些值)。

如果传递隐式请求并访问getQueryString参数(我认为是Play 2.1.0中添加的),则应该能够访问 Controller 中的其他可选参数:
def foo(name: String, age: Integer) = Action { implicit request =>
   val authCode: Option[String] = request.getQueryString("authCode")
   ...
}

更好的方法可能只是从 Controller 参数中删除您的可选名称和年龄,然后从queryString中提取所有内容:
def foo = Action { implicit request =>
    val nameOpt: Option[String] = request.getQueryString("name")
    val ageOpt: Option[String] = request.getQueryString("age")
    ...
}

更新:2.1.1版的current docs对此略有偏离(自问题#776起修复),但这是另一个(也是最好的IMHO)选项:
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")
}

关于scala - 在Play 2路由中处理自由格式的GET URL参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16301211/

相关文章:

scala - 在 Scala 中使用 None 或 EmptyMyObj?

scala - 在 Spark Json 到 Csv 转换中?

php - Symfony2 : how to set the host/base url in CLI scripts

routing - 路由中的多个 Controller

playframework - 在电子邮件中嵌入 URL

java - 如何从Elasticsearch读取数据到Spark?

scala - 案例类字段的简单迭代

php - Laravel 5 检查当前 url 是否匹配 Action

comet - Play! 的 Comet 支持如何工作?

java - 无法从 javascript 获取 json 到运行中的 java