我正在尝试使用 Akka Http + Sangria 实现一个带有 graphql 端点的玩具服务器。但是,当我发送带有有效负载的 POST 请求时(直接 cppy 并从 Chrome 检查粘贴)
{"query":"query FetchPokemons($height: Int) {\n pokemonsWithHeight(height: $height) {\n name\n }\n}","variables":{"height":100},"operationName ":"FetchPokemons"}
服务器报错
sangria.parser.SyntaxError:解析 GraphQL 查询时出现语法错误。输入意外结束,预期联合,注释,接口,标量,枚举,类型,输入类型或指令(第 1 行,第 79 列):“查询 FetchPokemons {\n pokemonsWithHeight(height: 100) {\n name\n }\n }"
但是在检查了 graphql 文档之后,似乎没有理由让这个查询字符串在解析阶段失败。这是我处理 http 正文的代码。
def queryResult(request: Json, schema: Schema[Resolvers, Unit], resolvers: Resolvers)(
implicit ec: ExecutionContext
): Route = { ctx =>
for {
queryJson <- Future.fromTry(Try(request.findAllByKey("query").head))
queryAst <- Future.fromTry(QueryParser.parse(queryJson.noSpaces))
variables = request.findAllByKey("variables").headOption.getOrElse(Json.obj())
opName = request.findAllByKey("operationName").headOption.flatMap(_.asString)
result <- Executor.execute(schema, queryAst, resolvers, operationName = opName, variables = variables)
res <- ctx.complete(StatusCodes.OK -> result)
} yield res
}