微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Scala sttp 客户端优雅地处理错误

如何解决使用 Scala sttp 客户端优雅地处理错误

我正在使用 scala sttp 客户端,特别是使用 Monix 后端,我有以下代码

def httpTask(href: String): Task[HttpBinaryResponse] = {
  val request = basicRequest
    .get(uri"$href")

  AsyncHttpClientMonixBackend
    .resource()
    .use { backend =>
      request.send(backend).map {
        response: Response[Either[String,String]] =>
          println(s"For URL: $href >> Got response code: ${response.code}")
          HttpBinaryResponse(
            href,response.code.isSuccess,response.headers.map(elem => (elem.name,elem.value)))
      }
    }
}

我有一组通过此方法运行的 URL:

hrefs.toSet.flatten.filter(_.startsWith("http")).map(httpTask) // Set[Task[HttpBinaryResponse]] 

在我的调用函数中,我然后执行任务:

val taskSeq = appBindings.httpService.parse(parserFilter)
val chunks = taskSeq.sliding(30,30).toSeq
val batchedTasks = chunks.map(chunk => Task.parSequence(chunk))
val allBatches = Task.sequence(batchedTasks).map(_.flatten)

然后我对物化类型进行模式匹配并返回,我想要的不仅仅是成功和失败,但我想同时拥有这两个值:

allBatches.runToFuture.materialize.map {
          case Success(elem) =>
            Ok(
              Json
                .obj("status" -> "Ok","URL size" -> s"${elem.size}")
            ).enableCors
          case Failure(err) =>
            Ok(
              Json
                .obj("status" -> "error","message" -> s"${err.getMessage}")
            ).enableCors
        }

我需要获取带有相应成功或失败消息的 URL 列表。使用我所拥有的这种方法,我只能得到其中之一,这在我模式匹配时很明显。如何同时收集成功和失败?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。