我有来自请求的以下json字段
Action {
request =>
val jsValueOption = request.body.asJson
jsValueOption.map {
json =>
val f1 = (json \ "f1").validate[String]
val f2 = (json \ "f2").validate[String]
val f3 = (json \ "f3").validate[String]
...
我需要确保所有这些字段都存在才能继续。否则,抛出BadRequest
响应。这样做的正确方法是什么?我对这些get
使用JsResult
,然后使用try-catch
或其他内容吗?
答案 0 :(得分:2)
以下是我将如何处理它(基于2.3快照文档 - http://www.playframework.com/documentation/2.3-SNAPSHOT/ScalaJsonHttp)。与drstevens非常相似,但我在验证结果上使用了折叠来演示BadRequest / OK流程。值得注意的是,我使用的Reads模式会为所有字段提供累积的验证错误。
import play.api.mvc._
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class MyRequest(f1: String, f2: String, f3: String)
implicit val myRequestReads: Reads[MyRequest] = (
(JsPath \ "f1").read[String] and
(JsPath \ "f2").read[String] and
(JsPath \ "f3").read[String]
)(MyRequest.apply _)
def myAction = Action(BodyParsers.parse.json) { request =>
val jsResult = request.body.validate[MyRequest]
jsResult.fold(
errors => {
BadRequest(Json.obj("status" ->"KO", "message" -> JsError.toFlatJson(errors)))
},
myRequest => {
println("Successful Request, f1 = " + myRequest.f1)
Ok(Json.obj("status" ->"OK")
}
)
}
答案 1 :(得分:1)
为了理解部分答案被删除,因为正如@kipsigman指出的那样,map
/ flatMap
JsResult
的行为不像应用和累积失败。我也知道这一点。插入Tony Morris说,“告诉过你”。
我无论如何都不会直接访问这个身体,而是通过下面的宏来定义Reads
/ Format
,或者通过像@kipsigman这样的应用组合来定义。{/ p>
case class MyRequest(f1: String, f2: String, f3: String)
object MyRequest { implicit val reads: Reads[MyRequest] = Json.reads[MyRequest] }
Action.async(BodyParsers.parse.json) { request =>
request.body.validate[MyRequest].map {
myRequest =>
JsString(s"f1 is '${myRequest.f1}' f2 is '${myRequest.f2}' f3 is '${myRequest.f3}'")
}
}