【发布时间】:2020-02-24 13:15:17
【问题描述】:
我正在尝试为 GitHub 的 API 编写一个小型库。我正在尝试模拟Github4s's library 的行为,这里是这个库的一个例子:
val user1 = Github(accessToken).users.get("rafaparadela")
object ProgramEval {
val u1 = user1.exec[Eval, HttpResponse[String]]().value
}
import cats.implicits._
import github4s.GithubResponses.GHResult
ProgramEval.u1 match {
// Here the actual value of the request is returned,
// not the same as Future's onComplete, where the return type is Unit
case Right(GHResult(result, status, headers)) => result.login
case Left(e) => e.getMessage
}
我引用文档:
每个 Github4s API 调用都会返回一个 GHIO[GHResponse[A]],它是 Free[Github4s, GHResponse[A]] 的别名。
GHResponse[A] 是 Either[GHException, GHResult[A]] 的类型别名。
GHResult 包含 Github 给出的结果 A 以及响应的状态码和标头:
在某些时候,他们正在使用HttpClient.scala 制作HttpRequest
我如何自己复制这种行为?我已经尝试使用 Cats.Eval 作为示例,但我最终得到了相同的 Future[String]。
另外,我在提出请求时面临一些嵌套问题,例如,要获取组织的贡献者列表,我需要创建两个 HttpRequest:
- 一个用于获取组织回购
- 每个 repo 一个,以便获取贡献者列表
Future[List[Future[Users]]] 上的这个结果,和我面临同样的问题,为了获得结果,我必须这样做:
(result:Future[List[Future[Users]]]) onComplete { users =>
users.foreach {
_ onComplete {
// Process result
}
}
}
但我想将值返回为github4s。我一直在阅读有关 Cats's Applicative and Traversable Functors 的文章,但没有运气。
【问题讨论】:
标签: scala future scala-cats github4s