【发布时间】: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,类似于呈现的代码,那也很棒。
【问题讨论】: