1

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

4

2 回答 2

3

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

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

于 2020-09-30T13:24:29.417 回答
0

我终于做了这样的事情。编译器在最后一行需要一些帮助,其中隐式被证明是不够的。貘的ztapir部分固定在 ZIO 效果类型Task中,因此在我的情况下不可用

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)))

}
于 2020-10-08T12:44:53.517 回答