gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:21:16 25 4
gpt4 key购买 nike

我想实现一个解析和验证 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com