【问题标题】:How to add custom error responses in Http4s?如何在 Http4s 中添加自定义错误响应?
【发布时间】:2020-08-28 14:28:41
【问题描述】:

每当我在我的 http4s 应用程序中遇到未知路由时,它都会返回带有 Content-Type: text/plain 和 body:

的 404 错误页面

找不到

如何强制它始终以 JSON 格式返回正文,Content-Type: application/json

{“消息”:“未找到”}

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

val httpApp = Router.publicRoutes[F].orNotFound.map(ErrorTranslator.handle)

其中ErrorTranslator 只检测带有客户端错误状态代码和Content-Type(不是application/json)的响应,然后将正文包装成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 Bad request)“翻译”成 JSON,类似于呈现的代码,那也很棒。

【问题讨论】:

    标签: scala http4s


    【解决方案1】:

    你也可以用 value 和 mapF function 来制作:

    val jsonNotFound: Response[F] =
      Response(
        Status.NotFound,
        body = Stream("""{"error": "Not found"}""").through(utf8Encode),
        headers = Headers(`Content-Type`(MediaType.application.json) :: Nil)
      )
    val routes: HttpRoutes[F] = routes.someRoutes().mapF(_.getOrElse(jsonNotFound))
    

    【讨论】:

    • 我觉得我的方法更简洁更简洁,谢谢!
    【解决方案2】:

    我想你已经用类似的方式定义了你的路由,那么你可以添加一个默认的 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"}"""))
    }
    

    【讨论】:

    • case _ -> _ 似乎可以工作,但它仍然可以正确处理其他错误代码,例如 400
    猜你喜欢
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2022-09-30
    • 2019-02-07
    • 2020-10-03
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多