[英]Scala cats - problem with encoding/decoding jsons
我创建了一个简单的路线:
class MyRoutes[F[_] : Async](service: MyService[F]) extends Http4sDsl[F] {
def routes: HttpRoutes[F] = HttpRoutes.of[F] {
case req@PUT -> Root / "bets" =>
for {
bet <- req.as[Bet]
created <- service.put(bet)
response <- Created(created)
} yield response
}
以及用于输入和输出的 jsons implicits
:
object jsons {
implicit def circeDecoder[A[_] : Sync, B: Decoder]: EntityDecoder[A, B] = jsonOf[A, B]
implicit def circeEncoder[A[_] : Sync, B: Encoder]: EntityEncoder[A, B] = jsonEncoderOf[A, B]
}
但是当我通过 Postman 运行这个程序时,我得到一个错误: The request body was invalid.
带有422
错误代码。 我认为是json编码器和解码器有问题,因为我的要求非常简单明了:
{
"stake": 434,
"name": "Something"
}
我试图在路由中添加一个隐式解码器:
implicit val betDecoder: EntityDecoder[F, Bet] = jsonOf[F, Bet]
但这也无济于事。 谁能帮助我并告诉我如何为 jsons 创建好的编码器和解码器? 我使用circe
库进行解析。
好吧,愚蠢的我,我解决了这个问题。 我(可能)对Bet
定义是错误的。 它是:
case class Bet(betId: BetId, stake: BigDecimal, name: String)
case class BetId(betId: String) extends AnyVal
所以我应该给Id
作为参数。 我把代码改成了这个:
case class Bet(betId: Option[BetId], stake: BigDecimal, name: String)
case class BetId(betId: String) extends AnyVal
在此之后,一切正常。 另一个问题是 - 这是好的做法还是可以以更好的方式完成?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.