You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HTTP4S Blaze客户端中获取服务端返回的详细错误信息?

解决HTTP4S Blaze客户端无法获取非2xx响应体的问题

问题根源在于client.expect[String]方法默认仅接受2xx系列状态码,当返回4xx/5xx时会直接抛出UnexpectedStatus异常,导致无法读取服务端返回的错误响应体。

解决方案:改用client.run处理全状态码响应

直接使用client.run发起请求,手动处理所有状态码的响应,包括读取错误状态下的响应体:

def callEffect(client: Client[IO]): IO[String] = {
  val uri = serverUrl
    .withPath("/abc")
  val request = GET(uri, Accept(MediaType.application.json))

  client.run(request).use { response =>
    // 读取响应体,无论状态码
    response.as[String].flatMap { body =>
      response.status match {
        case Status.Successful =>
          IO.pure(body)
        case otherStatus =>
          // 可自定义错误处理逻辑,比如包装异常或直接返回错误信息
          IO.raiseError(new RuntimeException(s"请求失败,状态码: ${otherStatus.code},错误信息: $body"))
      }
    }
  }
}

def deploy(implicit cs: ContextShift[IO]): IO[ExitCode] = {
  BlazeClientBuilder[IO](scala.concurrent.ExecutionContext.global).resource
    .use { client =>
      callEffect(client)
        .flatMap(res => IO.println(res))
        .handleError { e =>
          IO.println(s"捕获到错误: ${e.getMessage}")
        }
        .as(ExitCode.Success)
    }
}

关键改动说明

  • 替换client.expect为client.run(request).use:run方法不会自动过滤状态码,会返回完整的Response对象
  • 优先读取响应体response.as[String]:无论请求成功与否,先获取服务端返回的全部内容
  • 按response.status分支处理:区分成功状态和错误状态,可根据业务需求定制错误逻辑
  • 添加handleError捕获异常:确保错误信息能被正常打印或后续处理

这样修改后,即使遇到500/400状态码,也能获取到服务端返回的详细错误信息。

内容的提问来源于stack exchange,提问作者Amit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:40:22