我创建了一个简单的路线:
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
在这之后一切都正常。另一个问题是 - 这是一种好的做法还是可以以更好的方式完成?