首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpRoutes[RIO[E,*]]和HttpRoutes[zio.Task]之间的编译问题

HttpRoutes[RIO[E,*]]和HttpRoutes[zio.Task]之间的编译问题
EN

Stack Overflow用户
提问于 2020-09-30 19:30:11
回答 2查看 222关注 0票数 1

正在尝试编译这个对ZIO友好的小型Tapir/Http4s端点描述

代码语言:javascript
复制
import io.circe.generic.auto._
import org.http4s.HttpRoutes
import sttp.tapir.json.circe
import sttp.tapir.ztapir._
import sttp.tapir.server.http4s.ztapir._
import sttp.tapir.endpoint
import zio.RIO
import zio.interop.catz._

case class HealthReplyDTO(message: String)

final class HealthEndpointZTapir[E]() {
  private val prefixPath = "/health"
  val healthOkReply = HealthReplyDTO("OK")

  private val routeDescription: ZEndpoint[Unit, Unit, HealthReplyDTO] =
    endpoint.get.in(prefixPath).out(circe.jsonBody[HealthReplyDTO]).description("Health Endpoint")

  val route: HttpRoutes[RIO[E, *]]
  = routeDescription.toRoutes( _ => RIO.succeed(healthOkReply))

}

把这个放在最后一行。

Type mismatch. Required: HttpRoutes[RIO[E, *]], found: HttpRoutes[zio.Task]

任务是RIO的子类型,所以这应该可以很好地工作,对吧?还是我错过了什么。对这个世界来说,这是一个新手,所以如果能得到一些帮助,我们将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2020-09-30 21:24:29

Task确实是RIO[R, *]的一个子类型,但是来自http4s的HttpRoutes是不变的,因此出现了错误消息。

作为与http4s集成的结果,.toRoutes方法返回HttpRoutes[Task],它没有输入错误。通常,在设置服务器和处理路由时,http4s可以抛出任何类型的异常,因此我们需要使用Task

票数 3
EN

Stack Overflow用户

发布于 2020-10-08 20:44:54

我最终做了这样的事情。编译器在最后一行需要一点帮助,而隐含被证明是不够的。tapir的ztapir部分已在ZIO效果类型Task中修复,因此在我的示例中无法使用

代码语言:javascript
复制
import io.circe.generic.auto._
import org.http4s.HttpRoutes
import sttp.tapir.json.circe
import sttp.tapir.server.http4s._
import sttp.tapir.endpoint
import zio.RIO
import zio.interop.catz._
import sttp.tapir._

final class HealthEndpointTapir[E]() extends TapirHttp4sServer {

  private val prefixPath = "/health"
  val healthOkReply: HealthReplyDTO = HealthReplyDTO("OK")
  implicit val customServerOptions: Http4sServerOptions[RIO[E, *]] = Http4sServerOptions
    .default[RIO[E, *]]

  private val routeDescription: Endpoint[Unit, Unit, HealthReplyDTO, Any] =
    endpoint.get.in(prefixPath).out(circe.jsonBody[HealthReplyDTO]).description("Health Endpoint")

  val route: HttpRoutes[RIO[E, *]]
  = RichHttp4sHttpEndpoint[Unit, Unit, HealthReplyDTO, RIO[E, *]
(routeDescription).toRoutes( _ => RIO.succeed(Right(healthOkReply)))

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64136667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档