![](/img/trans.png)
[英]How to get JSON as string data from HttpResponse in Akka HTTP
[英]Scala - how to get data from IO[HttpResponse] in Hammock?
我有一个简单的方法:
def retrieveRepositories(url: String, params: String): IO[HttpResponse] = Hammock.getWithOpts(uri"$url", createOpts).exec[IO]
这是一个 http 客户端。 和json
解码器:
implicit def decodeResponseEntity(response: HttpResponse): Either[CodecException, List[GitRepository]] = Decoder[List[GitRepository]].decode(response.entity)
现在我想这样称呼这个客户:
def getRepos(organization: String, params: String): F[Either[CodecException, List[GitRepository]]] = for {
res <- retrieveRepositories(organization, params)
result <- Sync[F].delay(decodeResponseEntity(res))
} yield result
但是, result <- Sync[F].delay(decodeResponseEntity(res))
行存在问题,因为我收到错误: Type mismatch. Reguired: IO[B_] but found F[Either[CodecException, List[GitRepository]]]
Type mismatch. Reguired: IO[B_] but found F[Either[CodecException, List[GitRepository]]]
。 当我将unsafeRunSync()
方法添加到retrieveRepositories(organization, params)
时,它可以正常工作,但我应该在最后而不是在这里调用这个方法。 我应该如何解决它?
如果可以,您可能希望更改retrieveRepositories
的定义并参数化效果类型( F
),而不是使用具体的IO
类型。
如果您无法更改retrieveRepositories
,请在getRepos
中添加隐式LiftIO
约束。 您将能够使用liftIO
方法将具体IO
值提升到F
。 另一种方法是使用Async
类型类,它继承自Sync
和LiftIO
。
请参阅liftIO
文档: https://typelevel.org/cats-effect/typeclasses/liftio.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.