2013-04-30 74 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") 
}