BodyParser根据请求体返回Result

and*_*opp 2 scala playframework playframework-2.0

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

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

问题是它是目前的类型,BodyParser[JsResult[A]]而我希望它是类型BodyParser[A].如果JsError我希望它基本上返回400 Bad Request验证错误.

Play API文档中,我找不到允许我检查上一个主体解析器的结果并返回结果或继续到控制器的方法.

Jam*_*per 10

A BodyParser,在解析主体之后,产生一个Either[SimpleResult, A],其中SimpleResult一个错误结果应该立即返回而不是处理动作.方便的方法BodyParser不允许你这样做,所以相反,创建一个委托给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)))
  })
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到我们正在映射解析的结果,然后获取right值(一个成功的解析,将是JsValue),并调用flatMap它.我们的flatMap方法将JsResultfrom 转换validate为a Either[JsError, A],所以我们就在那里A,之后我们map离开JsErrorSimpleResult,我们很高兴.