不久前,我从akka-http切换到http4s。我想正确执行的基本操作之一-JSON处理,尤其是发送JSON响应。
我决定在ZIO中使用http4s而不是cat,因此这是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吗?
答案 0 :(得分:5)
是的,有:为任务定义,编码和解码器:
connection.insert({
into: this.tableName,
return: false,
skipDataCheck:true,
values: data
})
这种方式无需转换为字节。
HT:@mschuwalow
答案 1 :(得分:0)
对此有更简单的解决方案。如果要为HTTP响应处理案例类JSON编码,则只需添加以下导入即可:
import io.circe.generic.auto._
import org.http4s.circe.CirceEntityCodec._
顺便说一句,相同的导入也可以将传入的JSON请求解码为案例类