我正在使用Scala和Play,并在下面寻找一种更简洁的方式来编写POST请求处理程序:
def create = Action.async { request => {
request.body.asJson match {
case Some(x) => x.validate[UserDto] match {
case c: JsSuccess[UserDto] => doActualWork(c.get)
case e: JsError => Future.successful(BadRequest(""))
}
case None => Future.successful(BadRequest(""))
}
}
}
问题:
答案 0 :(得分:1)
更简洁的方法是使用 Play正文解析器。
def create = Action.async(parse.json[UserDto]) { request =>
doActualWork(request.body)
}
json正文解析器将验证请求的内容类型为application/json
,并在请求不符合预期时发回415 Unsupported Media Type
响应。因此,您无需再次检查操作代码。
注意: 如果您的客户未发送您可能尝试使用的内容类型:
parse.tolerantJson
- 这有点放松了
这是有效的,因为Action
特征实际上定义为:
trait Action[A] extends (Request[A] => Result) {
def parser: BodyParser[A]
}
答案 1 :(得分:0)
使用json body解析器。现在请求的主体自动包含json,你可以摆脱外部模式匹配。
def create = Action.async(parse.json) {
_.body.validate[UserDto] match {
case JsSuccess(value, _) => doActualWork(value)
case _ => Future.successful(BadRequest("bad json body"))
}
}
建议在此处说出错误,而不是说bad json body