Ich habe die Formularüberprüfung mit benutzerdefinierten Einschränkungen implementiert, aber jetzt möchte ich dasselbe mit JSON-Daten machen.Benutzerdefinierte JSON-Validierungsbeschränkungen in Play Framework 2.3 (Scala)
Wie kann ich benutzerdefinierte Validierungsregeln auf einen JSON-Parser anwenden?
Beispiel: Die POST-Anfrage des Clients enthält einen Benutzernamen (username
) und ich möchte nicht nur sicherstellen, dass dieser Parameter ein nicht leerer Text ist, sondern auch, dass dieser Benutzer tatsächlich in der Datenbank vorhanden ist.
// In the controller...
def postNew = Action { implicit request =>
request.body.asJson.map { json =>
json.validate[ExampleCaseClass] match {
case success: JsSuccess[ExampleCaseClass] =>
val obj: ExampleCaseClass = success.get
// ...do something with obj...
Ok("ok")
case error: JsError =>
BadRequest(JsError.toFlatJson(error))
}
} getOrElse(BadRequest(Json.obj("msg" -> "JSON request expected")))
}
// In ExampleCaseClass.scala...
case class ExampleCaseClass(username: String, somethingElse: String)
object ExampleCaseClass {
// That's what I would use for a form:
val userCheck: Mapping[String] = nonEmptyText.verifying(userExistsConstraint)
implicit val exampleReads: Reads[ExampleCaseClass] = (
(JsPath \ "username").read[String] and
(JsPath \ "somethingElse").read[String]
)(ExampleCaseClass.apply _)
}
, die so weit ist, wie ich, aber dies stellt nur sicher, dass username
ein String ist. Wie kann ich meine zusätzliche benutzerdefinierte Validierungsregel, z. um zu überprüfen, ob der angegebene Benutzer wirklich existiert? Ist das überhaupt möglich?
Sicher, kann ich meinen obj
in dem case success
Abschnitt in der Aktion nehmen und zusätzliche Kontrollen dort durchführen, aber dies scheint nicht sehr elegant, denn dann würde ich meine eigene Fehlermeldung erstellen und konnte nur Benutzer JsError.toFlatJson(error)
für einige Fälle. Nach stundenlangem Suchen und Versuchen konnte ich keine Beispiele finden.
Für regelmäßige Formen würde ich so etwas wie folgt verwenden:
// In the controller object...
val userValidConstraint: Constraint[String] = Constraint("constraints.uservalid")({ username =>
if (User.find(username).isDefined) {
Valid
} else {
val errors = Seq(ValidationError("User does not exist"))
Invalid(errors)
}
})
val userCheck: Mapping[String] = nonEmptyText.verifying(userValidConstraint)
val exampleForm = Form(
mapping(
"username" -> userCheck
// ...and maybe some more fields...
)(ExampleCaseClass.apply)(ExampleCaseClass.unapply)
)
// In the controller's action method...
exampleForm.bindFromRequest.fold(
formWithErrors => {
BadRequest("Example error message")
},
formData => {
// do something
Ok("Valid!")
}
)
Aber was, wenn die Daten als JSON eingereicht?
würde ich vorschlagen, die Benutzer nach JSON-Validierung Validierung. Ich denke, die JSON-Validierung wird am besten verwendet, um sicherzustellen, dass Sie in das Scala-Objekt landen können, und dann wird alles, was Sie tun müssen, von da an komfortabler. – acjay