scala HTTP4S安全编码器

bnlyeluc  于 2023-11-18  发布在  Scala
关注(0)|答案(1)|浏览(115)

我已经为ZIO应用程序创建了HttpRoutes

class BlockChainAPI[R <: BlockChain] {
  type BlockChainTask[A] = RIO[R, A]
  private val dsl = Http4sDsl[BlockChainTask]

  import dsl._

  implicit def jsonDecoder[A](implicit decoder: Decoder[A]): EntityDecoder[BlockChainTask, A] = jsonOf[BlockChainTask, A]

  implicit def jsonEncoder[A](implicit encoder: Encoder[A]): EntityEncoder[BlockChainTask, A] = jsonEncoderOf[BlockChainTask, A]

  val routes: HttpRoutes[BlockChainTask] = HttpRoutes.of[BlockChainTask] {

    case GET -> Root / "message" / message =>
      val newMessage = BlockMessage(message)
      BlockChain
        .addBlock(Seq(newMessage))
        .foldZIO(
          err => BadRequest(err.getMessage),
          _ => Ok(s"Message $message added")
        )
  }
}

字符串
它工作正常!但今天我添加了一个新的路由:

case GET -> Root =>
      StaticFile.fromPath(fs2.io.file.Path("/api-docs/index.html")).getOrElse(NotFound()).foldZIO(
        err => InternalServerError(err.getMessage),
        result => Ok(result)
      )


它失败并出错:无法从具有java.io.Serializable的产品转换为实体,因为找不到UnityEncoder [[A]zio.ZIO[R,Throwable,A],Product with java.io.Serializable]示例。
也许有人知道怎么修!
我补充道:

implicit def jsonEncoder2[A <: Product with Serializable](implicit encoder: Encoder[A]): EntityEncoder[BlockChainTask, A] = jsonEncoderOf[BlockChainTask, A]


但它不起作用

qv7cva1a

qv7cva1a1#

你的result有一个Product with Serializable类型,这是http4s不知道如何在HTTP响应中编码的。
这是因为StaticFile.fromPath(fs2.io.file.Path("/api-docs/index.html")).getOrElse(NotFound())实际上给了你两个不相关的类型,这取决于你是通过nominal路径还是getOrElse路径。
您需要在两个路径中返回一致的类型,或者在此阶段不使用getOrElse,或者将缺少的大小写移到错误通道。
使用带有显式类型的中间变量应该会有所帮助。

相关问题