在播放2路由处理自由获取URL参数(Handling freeform GET URL parame

2019-09-01 12:16发布

比方说,我有选择性地接受两个参数的作用:

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

什么是这个正确的语法?

Answer 1:

像这样的东西应该工作:

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")
    ...
}

更新 : 当前文档的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")
}


文章来源: Handling freeform GET URL parameters in Play 2 routing