2013-04-30 10 views
8

Powiedzmy mam działanie, które ewentualnie przyjmuje dwa parametry:Handling swobodnych parametrów GET URL w Play 2 routingu

def foo(name: String, age: Integer) = Action { 
    // name & age can both be null if not passed 
} 

Jak skonfigurować mój plik route pracować z którymkolwiek z poniższych składni wywołania:

/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 

Jaka jest prawidłowa składnia tego?

+0

Bardzo związane z http: // stackoverflow .pl/questions/9657163/how-to-handle-optional-query-parameters-in-play-framework –

Odpowiedz

17

Coś jak to powinno działać:

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

Ponieważ twoje parametry mogą być przerwane musisz podać domyślne wartości dla nich (i obsługiwać te wartości w funkcji regulatora).

Powinieneś być w stanie uzyskać dostęp do innych opcjonalnych parametrów w sterowniku jeśli przechodzą w sposób dorozumiany wniosek i uzyskać dostęp do parametru getQueryString (dodane w zagraj 2.1.0 chyba):

def foo(name: String, age: Integer) = Action { implicit request => 
    val authCode: Option[String] = request.getQueryString("authCode") 
    ... 
} 

Ładniejszym sposobem nie może to być po prostu zabrać opcjonalną nazwę i wiek z parametrów regulatora i wydobyć wszystko z kwerendy:

def foo = Action { implicit request => 
    val nameOpt: Option[String] = request.getQueryString("name") 
    val ageOpt: Option[String] = request.getQueryString("age") 
    ... 
} 

aktualizacji: the current docs do 2.1.1 są nieco f o to (od utrwalono emisyjnej # 776), ale jest to kolejny (i najlepiej, IMHO) opcja:

GET /foo controllers.MyController.foo(name: Option[String], age: Option[Int]) 

I ...

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