scala 如何在HTTP4S客户端检索错误消息?

ni65a41a  于 2022-11-23  发布在  Scala
关注(0)|答案(1)|浏览(102)

我正在尝试使用http 4s的Blaze客户端进行http调用。当返回200响应时,它工作正常,但在HTTP 500或400的情况下,我无法弄清楚如何检索从服务器返回的详细错误消息。
我只能在此客户端的日志中看到以下内容。
2022-11-10 23:37:40信息-正在关闭连接池:curAllocated=1个空闲队列。size=1个等待队列。size=0最大等待队列限制=256已关闭=false org.http4s.client.UnexpectedStatus:意外HTTP状态:500内部服务器错误

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

    client.expect[String](request).map { res =>
      println(res)
      res
    }
  }

  def deploy(implicit cs: ContextShift[IO]): IO[ExitCode] = {
    BlazeClientBuilder[IO](scala.concurrent.ExecutionContext.global).resource
      .map(x => println(callEffect(x).unsafeRunSync()))
      .use(_ => IO.unit.as(ExitCode.Success))
  }
5ssjco0h

5ssjco0h1#

由于结果是在IO中提供的,因此可以使用IO的任何错误处理功能来处理问题,例如使用redeem

def run(args: List[String]): IO[ExitCode] = {
    BlazeClientBuilder[IO].resource
      .use(client =>
        for {
          result <- callEffect(client).redeem(
            error => "could not get a result",
            something => s"this is what I got: $something"
          )
          _ <- IO.println(result)
        } yield ExitCode.Success
      )
  }

这里有一篇关于这个主题的很棒的文章:https://softwaremill.com/practical-guide-to-error-handling-in-scala-cats-and-cats-effect/
为了获得更多的控制,您可以从客户端本身处理错误,例如使用expectOr()而不是expect(),这样您就可以访问一个方便的onError: Response[F] => F[Throwable]

相关问题