在http4s中发送JSON响应的正确方法是什么?

时间:2019-05-23 10:22:23

标签: scala http4s scalaz-zio

不久前,我从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吗?

2 个答案:

答案 0 :(得分:5)

是的,有:为任务定义,编码和解码器:

connection.insert({
        into: this.tableName,
        return: false,
        skipDataCheck:true,
        values: data
})

这种方式无需转换为字节。

编辑:这里有完整的示例:https://github.com/mschuwalow/zio-todo-backend/blob/develop/src/main/scala/com/schuwalow/zio/todo/http/TodoService.scala

HT:@mschuwalow

答案 1 :(得分:0)

对此有更简单的解决方案。如果要为HTTP响应处理案例类JSON编码,则只需添加以下导入即可:

import io.circe.generic.auto._
import org.http4s.circe.CirceEntityCodec._

顺便说一句,相同的导入也可以将传入的JSON请求解码为案例类