gpt4 book ai didi

scala - 如何在 Http4s 中添加自定义错误响应?

转载 作者:行者123 更新时间:2023-12-04 21:28:27 26 4
gpt4 key购买 nike

每当我在 http4s 应用程序中遇到未知路由时,它都会返回 404 错误页面,内容类型为:text/plain 和正文:

Not found



如何强制它始终以 JSON 形式返回正文,内容类型为:application/json?

{"message": "Not found"}



我发现当我组装 httpApp 时,我可以映射它并“调整”响应:
val httpApp = Router.publicRoutes[F].orNotFound.map(ErrorTranslator.handle)

哪里 ErrorTranslator只检测带有客户端错误状态代码和不是 application/json 的 Content-Type 的响应,然后将 body 包装到 JSON 中:
object ErrorTranslator {

val ContentType = "Content-Type"
val ApplicationJson = "application/json"

private def translate[F[_]: ConcurrentEffect: Sync](r: Response[F]): Response[F] =
r.headers.get(CaseInsensitiveString(ContentType)).map(_.value) match {
case Some(ApplicationJson) => r
case _ => r.withEntity(r.bodyAsText.map(ErrorView(_))) //wrap reponse body into enity
}

def handle[F[_]: ConcurrentEffect: Sync]: PartialFunction[Response[F], Response[F]] = {
case Status.ClientError(r) => translate(r)
case r => r
}

}

它有效,但我想知道是否有一些不太复杂的解决方案?

如果解决方案可以“翻译”其他错误,例如 ,那就太好了。 400 错误请求 转换成 JSON,类似于呈现的代码。

最佳答案

我想你已经以类似的方式定义了你的路由,然后你可以添加一个 default case 语句

 HttpRoutes.of[IO] {
case GET -> Root / "api" =>
Ok()

case _ -> Root =>
// Your default route could be done like this
Ok(io.circe.parser.parse("""{"message": "Not Found"}"""))
}

关于scala - 如何在 Http4s 中添加自定义错误响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59518604/

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