在scala中使用play解析HTTP请求JSON主体

时间:2016-10-05 12:00:05

标签: scala playframework

我正在使用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(""))
    }
  }
  }

问题:

  1. 解析JSON对象UserDto所需的许多行(这是一个常见的过程)
  2. 高度嵌套(可读性差)

2 个答案:

答案 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