scala - 在 http4s 中发送 JSON 响应的正确方法是什么?
问题描述
不久前,我从 akka-http 切换到 http4s。我想做正确的基本事情之一——JSON 处理,特别是发送 JSON 响应。
我决定使用带有 ZIO 的 http4s 而不是猫,所以下面是 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/main/scala/com/schuwalow/zio/todo/http/TodoService.scala
HT:@mschuwalow
推荐阅读
- java - 检查不重复的随机数
- android - 用于相机的具有透明度的矩形框
- mysql - MySQL 复制在 Master 上具有 NULL-able 列,在 Slave 上具有 NOT NULL
- rspec - Rails 5 Api 中的 rspec 控制器测试仍然很常见吗?
- python - Jupyter Notebook 不会输出
- python - 通过 id 计算从基线的变化
- visual-studio - Visual Studio 发布版本部署到 Hololens,但主版本没有 - 激活 Windows 应用商店失败
- java - 获取所有 DBpedia 资源的列表
- python-3.x - 在 python 中使用矩阵创建灰度图像
- python - 打印类的结果 - python 2.7