我创建了一条简单的路线:
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]
}
但是当我通过邮递员运行该程序时,出现了一个错误:
The request body was invalid.
,错误代码为422
。我认为json编码器和解码器有问题,因为我的要求非常简单明了:
{
"stake": 434,
"name": "Something"
}
我试图在路由中添加一个隐式解码器:
implicit val betDecoder: EntityDecoder[F, Bet] = jsonOf[F, Bet]
但是它也没有帮助。谁能帮助我,并告诉我如何为json创建良好的编码器和解码器?我使用circe
库进行解析。
答案 0 :(得分:1)
好吧,愚蠢的我,我解决了这个问题。
我对driversig
的定义错误(可能)。是:
Bet
所以我应该给case class Bet(betId: BetId, stake: BigDecimal, name: String)
case class BetId(betId: String) extends AnyVal
作为参数。我将代码更改为此:
Id
,在此之后一切正常。 另一个问题是-是好的做法还是可以更好的方式完成?