これはいくつかの方法がありますが、いずれもiとはみなされませんフィンチのためのdiomatic。 Endpoint
内の任意のJSONオブジェクトを受け入れるより安全な方法は、使用しているJSONライブラリを介して公開されているJSON AST APIにドロップすることです。 json4sの場合はorg.json4s.JsonAST.JValue
になります。
scala> import io.finch._, io.finch.json4s._, org.json4s._
scala> implicit val formats: Formats = DefaultFormats
formats: org.json4s.Formats = [email protected]
scala> val e = jsonBody[JsonAST.JValue]
e: io.finch.Endpoint[org.json4s.JsonAST.JValue] = body
scala> e(Input.post("/").withBody[Application.Json](Map("foo" -> 1, "bar" -> "baz"))).awaitValueUnsafe()
res2: Option[org.json4s.JsonAST.JValue] = Some(JObject(List((foo,JInt(1)), (bar,JString(baz)))))
これは、あなたが手動で操作する必要があると思いますJsonAST.JValue
インスタンスを与えるだろう(私はそのために露出パターンマッチングのAPIがあると仮定します)。
Finch/JSON4SにMap[String, Any]
というJSONオブジェクトのデコードを依頼するという方法があります(さらに危険です)。ただし、クライアントがJSON配列を最上位エンティティとして送信することを期待していない場合にのみ機能します。
scala> import io.finch._, io.finch.json4s._, org.json4s._
scala> implicit val formats: Formats = DefaultFormats
formats: org.json4s.Formats = [email protected]
scala> val b = jsonBody[Map[String, Any]]
b: io.finch.Endpoint[Map[String,Any]] = body
scala> b(Input.post("/").withBody[Application.Json](Map("foo" -> 1, "bar" -> "baz"))).awaitValueUnsafe()
res1: Option[Map[String,Any]] = Some(Map(foo -> 1, bar -> baz))
私が間違っている場合は、私を訂正してください。しかし、私の質問は、ユーザーが送信したPUT要求のエンドポイントからJsonペイロードを消費する方法でした。 WithBodyユーザーが送信したペイロードをオーバーライドします。 –
これらの2つの例の最後の行は、エンドポイントが特定の入力に対して何を返すかを示すためのものです。あなたはあなたのアプリケーションでそれを必要としません。すべての混乱を解消するのに役立つ[ユーザーガイド](https://finagle.github.io/finch/user-guide.html)をご覧になることをお勧めします。 –