正在尝试编译这个对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的子类型,所以这应该可以很好地工作,对吧?还是我错过了什么。对这个世界来说,这是一个新手,所以如果能得到一些帮助,我们将不胜感激。
发布于 2020-09-30 21:24:29
Task确实是RIO[R, *]的一个子类型,但是来自http4s的HttpRoutes是不变的,因此出现了错误消息。
作为与http4s集成的结果,.toRoutes方法返回HttpRoutes[Task],它没有输入错误。通常,在设置服务器和处理路由时,http4s可以抛出任何类型的异常,因此我们需要使用Task。
发布于 2020-10-08 20:44:54
我最终做了这样的事情。编译器在最后一行需要一点帮助,而隐含被证明是不够的。tapir的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)))
}https://stackoverflow.com/questions/64136667
复制相似问题