2013-04-30 9 views
8

Lassen Sie sich sagen, dass ich eine Aktion, die zwei Parameter optional akzeptiert:Umgang mit Freiform GET URL-Parameter im Play-2-Routing

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

Wie richte ich meine route Datei mit einem der folgenden Aufruf-Syntax zu arbeiten:

/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 

Was ist die korrekte Syntax dafür?

+0

Sehr viel im Zusammenhang mit http: // Stackoverflow com/questions/9657163/how-to-handle-optionale-Abfrage-Parameter-in-play-Framework –

Antwort

17

So etwas sollte funktionieren:

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

Da Ihre Parameter können Sie für diese Standardwerte zu schaffen, werden weggelassen (und diese Werte in der Reglerfunktion zu verarbeiten).

Sie sollten in der Lage sein, andere optionale Parameter in der Steuerung zugreifen, wenn Sie in einer impliziten Anforderung übergeben und Zugriff auf die getQueryString Parameter (hinzugefügt in Play 2.1.0 glaube ich):

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

Ein schöner Weg seien sie könnte es nur optionalen Namen und das Alter aus der Reglerparameter zu nehmen und alles aus der querystring extrahieren:

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

aktualisieren: die current docs für 2.1.1 sind ein bisschen f über diese (da mit der Ausgabe # 776 festgelegt), aber das ist ein anderer (und die beste, IMHO) Option:

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

Und ...

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