これは、circe をデコーダーとして使用する単純なフィンチ サーバーです。
import com.twitter.finagle.http.RequestBuilder
import com.twitter.io.Buf
import io.circe.generic.auto._
import io.finch._
import io.finch.circe._
case class Test(myValue: Int)
val api = post("foo" :: body.as[Test]) { test: Test => Ok(test) }
val bodyPost = RequestBuilder()
.url("http://localhost:8080/foo")
.buildPost(Buf.Utf8("""{ "myValue" : 42 }"""))
api.toService.apply(bodyPost).onSuccess { response =>
println(s"$response: ${response.contentString}")
}
// output: Response("HTTP/1.1 Status(200)"): {"myValue":42}
を に変更するmyValue
とOption
、すぐに使用でき、上記のコードと同じ結果が得られます。ただし、次のように変更しますscalaz.Maybe
。
import scalaz.Maybe
case class Test(myValue: Maybe[Int])
結果:
Response("HTTP/1.1 Status(400)"): {"メッセージ":"本文を Test に変換できません: CNil: El(DownField(myValue),true,false)."}
必要なエンコーダー/デコーダーをどのように実装すればよいですか?