这是我对scala的第一次体验。我尝试使用Play2制作一个小型REST控制器。
我的主要目标是让POST路由中包含一些json数据。
这就是我已经做过的事情:
def instMeasurement(variable: String) = Action { request =>
request.body.asJson.map { json =>
val measurement = MongoDBObject(
"variable" -> variable,
"quantity" -> (json \ "quantity").asOpt[Float].getOrElse(BadRequest("Missing parameter [quantity]")),
"when" -> (json \ "occurTime").asOpt[String].getOrElse(BadRequest("Missing parameter [occurTime]")))
dao("powermeter").save(measurement)
Ok(json)
}.getOrElse(
BadRequest(Json.toJson("JSON Body missing"))
)
}
一切正常,解决了错误过程。我想路由到BadRequest。
Play 2纪录片显示了一个小例子:
def sayHello = Action { request =>
request.body.asJson.map { json =>
(json \ "name").asOpt[String].map { name =>
Ok("Hello " + name)
}.getOrElse {
BadRequest("Missing parameter [name]")
}
}.getOrElse {
BadRequest("Expecting Json data")
}
}
听起来很完美,但它没有显示如何在json中处理多个值。
如何使用json中的2个值(例如,name和firstname)执行相同的操作? 如果json没有完成,我如何解析json并路由到BadRequest?
答案 0 :(得分:0)
如果我理解正确,您想要处理多个缺少的字段。我的解决方案看起来像这样:
val fields = List("firstname", "lastname")
val options = fields.map(name => (json \ name).asOpt[String])
val errors = options.zip(fields).collect {
case (None, f) => f
}
if(errors.isEmpty){ Ok(options.flatten.mkString(" "))}
else { BadRequest("Missing Fields: " + errors.mkString(" \n "))