Ich implementiere eine Web-API mit dem Scala 2.0.2 Play Framework. Ich möchte eine Anzahl von Get-Parametern extrahieren und validieren. Und dazu benutze ich eine "Spielform", die es mir ermöglicht, optionale Felder zu definieren.Wie Standardwerte optionale Felder in Play-Rahmenformen definieren?
Problem: Für diese optionalen Felder muss ich einen Standardwert definieren, wenn der Parameter nicht übergeben wird. Der Code soll korrekt diese drei Anwendungsfälle analysieren:?
- /test top = abc (Fehler, abc keine ganze Zahl ist)
- /test top = 123 (gültig sind, top 123)
- /Test (gültig, Top-42 (Standardwert))
ich habe mit dem folgenden Code kommen:
def test = Action {
implicit request =>
case class CData(top:Int)
val p = Form(
mapping(
"top" -> optional(number)
)((top) => CData($top.getOrElse(42))) ((cdata:CData) => Some(Some(cdata.top)))
).bindFromRequest()
Ok("all done.")
}
Der Code funktioniert, aber es ist definitiv nicht elegant. Es gibt viele Kesselplatten, nur um einen Standardwert für einen fehlenden Anforderungsparameter einzurichten.
Kann jemand eine sauberere und mehr coincise Lösung vorschlagen?
Dies ist die vorgeschlagene Lösung funktioniert gut. Der einzige Nachteil dieser Lösung besteht leider darin, dass sie mit einer großen Anzahl von Standardparametern nicht gut skaliert. Wenn Sie einen Webdienst/eine Webanwendung erstellen, die die Filterung von Listen unterstützen muss, kann die Sichtbarkeit aller Standardparameter in der Route die Lesbarkeit und die Robustheit des Codes beeinträchtigen.In allen anderen Szenarien ist dies in der Tat die bevorzugte Lösung – natbusa
Antwort aktualisiert mit einer Hilfsmethode-Implementierung, die Sie nützlich finden können. – lambdas
Ich habe eine Erweiterung des Play-Frameworks vorgeschlagen, um einen Code-basierten Ansatz für Standardparameter zu programmieren. Siehe https://github.com/playframework/Play20/pull/381 – natbusa