scala - BodyParser 根据请求体返回结果

标签 scala playframework playframework-2.0

我想实现一个解析和验证 request.body 的 BodyParser,它基于 parse.json,目前看起来像这样:

def parseModel[A](implicit reads: Reads[A]): BodyParser[JsResult[A]] =
  parse.json.map(_.validate[A])

问题是它当前是 BodyParser[JsResult[A]] 类型,而我希望它是 BodyParser[A] 类型。在 JsError 的情况下,我希望它基本上返回带有验证错误的 400 Bad Request

Play API docs我找不到允许我检查先前主体解析器的结果并返回结果或继续到 Controller 的方法。

最佳答案

一个BodyParser,在解析body之后,产生一个Either[SimpleResult, A],其中SimpleResult是一个错误结果,应该是立即返回而不是处理操作。 BodyParser 上的便捷方法不允许您这样做,因此,创建一个委托(delegate)给 JSON 主体解析器的新主体解析器:

def validateJson[A](implicit reads: Reads[A]) = new BodyParser[A] {
  def apply(request: RequestHeader) = parse.json(request).map(_.right.flatMap { json =>
    json.validate[A].asEither.left.map(e => BadRequest(JsError.toFlatJson(e)))
  })
}

你可以在这里看到我们正在映射解析的结果,然后取正确的值(一个成功的解析,将是JsValue),并调用flatMap 就可以了。我们的 flatMap 方法将 JsResultvalidate 转换为 Either[JsError, A],所以我们完成了一半那里有 A,之后我们将 map 左边的 JsErrorSimpleResult,我们就可以开始了。

关于scala - BodyParser 根据请求体返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18944762/

相关文章:

java - Play : populating a helper select from Java

java - 在 Play 2.1 (Java) 中运行后台任务的正确方法是什么?

scala - 关于如何在 Scala 中使用随机值向现有 DataFrame 添加新列

scala - 如何在 Akka Http 中发送响应代码作为响应?

scala - 使用 Scala 从 HDFS 读取数据

java - 是否有类似 Spark 的 Kafka Streams 累加器?

java - Mac 上的 Play 框架,性能问题

java - 为什么 IntelliJ 说 : Package secure does not exist?

scala - Json 转换器 - 来自 2 个现有字段的新字段

templates - Play 中所有 View 的可重用 Scala 代码