不久前,我从akka-http切换到http4。我想正确地做的基本事情之一 - JSON处理,特别是发送JSON响应。
我决定将HTTP4与Zio一起使用,而不是猫,所以这是HTTP路线的样子:
import fs2.Stream
import org.http4s._
import org.http4s.dsl.io._
import org.http4s.implicits._
import scalaz.zio.Task
import scalaz.zio.interop.catz._
import io.circe.generic.auto._
import io.circe.syntax._
class TweetsRoutes {
case class Tweet(author: String, tweet: String)
val helloWorldService = HttpRoutes.of[Task] {
case GET -> Root / "hello" / name => Task {
Response[Task](Ok)
.withBodyStream(Stream.emits(
Tweet(name, "dummy tweet text").asJson.toString.getBytes
))
}
}.orNotFound
}
如您所见,JSON序列化部分是冗长的:
.withBodyStream(Stream.emits(
Tweet(name, "dummy tweet text").asJson.toString.getBytes
))
是否有其他方法可以在响应中发送JSON?
是的,有:任务定义和编码器和解码器:
implicit def circeJsonDecoder[A](
implicit decoder: Decoder[A]
): EntityDecoder[Task, A] = jsonOf[Task, A]
implicit def circeJsonEncoder[A](
implicit encoder: Encoder[A]
): EntityEncoder[Task, A] = jsonEncoderOf[Task, A]
这样,无需转换为字节。
编辑:这里有一个完整的示例:https://github.com/mschuwalow/zio-todo-backend/blob/develop/src/src/main/scala/scala/com/schuwalow/zio/zio/todo/todo/htttp/todoservice。Scala
ht:@mschuwalow
为此有更简单的解决方案。如果要处理http响应的案例类JSON编码,则可以添加以下导入:
import io.circe.generic.auto._
import org.http4s.circe.CirceEntityCodec._
顺便说一句,相同的进口处理传入JSON请求的解码以及