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

Krz*_*sik 6 scala http4s

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

未找到

如何强制它始终以Content-Type: application/json 的形式将 body 返回为 JSON ?

{“未找到信息”}

我发现当我组装httpApp 时,我可以映射它并“调整”响应:

val httpApp = Router.publicRoutes[F].orNotFound.map(ErrorTranslator.handle)
Run Code Online (Sandbox Code Playgroud)

其中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
  }

}
Run Code Online (Sandbox Code Playgroud)

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

如果解决方案可以将其他错误(例如400 Bad request) “翻译”为 JSON,类似于呈现的代码,那也很棒。