如何在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
相关产品推荐
相关产品推荐

