'daki Özel JSON doğrulama sınırlamaları Özel kısıtlamalar ile form doğrulaması yapmayı başardım, ancak şimdi aynı şeyi JSON verileriyle yapmak istiyorum.Play Framework 2.3 (Scala)
Özel doğrulama kurallarını JSON ayrıştırıcısına nasıl uygularım?
Örnek: İstemcinin POST isteği bir kullanıcı adı (username
) içerir ve yalnızca bu parametrenin boş olmayan bir metin olduğundan emin olmak istemiyorum, aynı zamanda bu kullanıcının veritabanında da var olduğundan emin olmak istiyorum. bildiğim kadarıyla olsun, ama bu sadece username
String olmasını sağlar
// 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 _)
}
. Ek özel doğrulama kuralımı, ör. Verilen kullanıcının gerçekten var olup olmadığını kontrol etmek için? Bu mümkün mü? Sonra ben kendi hata mesajı oluşturmak zorunda ve bunu ancak kullanıcı JsError.toFlatJson(error)
ediyorum çünkü
Tabi, eylem benim obj
yılında case success
bölümünü alıp orada ek denetimler gerçekleştiren, ancak bu çok şık görünmüyor olabilir bazı durumlar için. Saatlerce aradıktan ve denedikten sonra hiçbir örnek bulamadım.
// 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!")
}
)
Ama hangi verileri JSON olarak gönderilirse:
düzenli formları için böyle bir şey kullanmak istiyorum?
. Bence JSON validasyonu Scala obje arazisine girebilmek için en iyi şekilde kullanılır, ve sonra yapmanız gereken her şey oradan daha rahat olacaktır. – acjay