首页 > 解决方案 > HttpRoutes[RIO[E, *]] 和 HttpRoutes[zio.Task] 之间的编译问题

问题描述

试图编译这个小型 ZIO 友好的 Tapir/Http4s 端点描述

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 的子类型,所以这应该可以正常工作吧?或者我在这里错过了什么。这个世界有点菜鸟,所以非常感谢一些帮助。

标签: scalahttp4sziotapir

解决方案


Task确实是 的子类型RIO[R, *],但从HttpRouteshttp4s 是不变的,因此错误消息。

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


推荐阅读