我想实现一个解析和验证 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
方法将 JsResult
从 validate
转换为 Either[JsError, A]
,所以我们完成了一半那里有 A
,之后我们将 map
左边的 JsError
到 SimpleResult
,我们就可以开始了。
关于scala - BodyParser 根据请求体返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18944762/