Sangria API 需要 Map[String, Any] 的类型
这不是真的。sangria 中执行的变量可以是任意类型T
,唯一的要求是你有一个InputUnmarshaller[T]
类型类的实例。所有编组集成库都InputUnmarshaller
为对应的 JSON AST 类型提供了一个实例。
这意味着sangria-circe定义InputUnmarshaller[io.circe.Json]
并且您可以使用import sangria.marshalling.circe._
.
这是一个小而独立的示例,说明如何将 circeJson
用作变量:
import io.circe.Json
import sangria.schema._
import sangria.execution._
import sangria.macros._
import sangria.marshalling.circe._
val query =
graphql"""
query ($$foo: Int!, $$bar: Int!) {
add(a: $$foo, b: $$bar)
}
"""
val QueryType = ObjectType("Query", fields[Unit, Unit](
Field("add", IntType,
arguments = Argument("a", IntType) :: Argument("b", IntType) :: Nil,
resolve = c ⇒ c.arg[Int]("a") + c.arg[Int]("b"))))
val schema = Schema(QueryType)
val vars = Json.obj(
"foo" → Json.fromInt(123),
"bar" → Json.fromInt(456))
val result: Future[Json] =
Executor.execute(schema, query, variables = vars)
正如您在此示例中所看到的,我将io.circe.Json
其用作执行的变量。执行将产生以下结果 JSON:
{
"data": {
"add": 579
}
}