我正在尝试使用Akka Http + Sangria实现带有graphql端点的玩具服务器。但是,当我发送带有有效负载的POST请求(直接cppy并从Chrome检查中粘贴)
{“ query”:“ query FetchPokemons($ height:Int){\ n pokemonsWithHeight(height:$ height){\ n名称\ n } \ n}“,”变量“:{” height“:100},” operationName“:” FetchPokemons“}
服务器出现错误
sangria.parser.SyntaxError:解析GraphQL查询时出现语法错误。 输入的意外结束,预期的并集,注释,界面,标量, 枚举,类型,inputType或指令(第1行,第79列):“查询 FetchPokemons {\ n pokemonsWithHeight(height:100){\ n名称\ 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
}
答案 0 :(得分:0)
我必须手动从
中删除\“和\\ n“ query FetchPokemons($ height:Int){\ n pokemonsWithHeight(height: $ height){\ n名称\ n} \ n}“
要喂
query FetchPokemons($ height:Int){pokemonsWithHeight(height: $ height){name}}
使用解析器
def formatQuery(s: String): String = s.replaceAllLiterally("\\n","").replaceAllLiterally("\"", "")
此解决方案简单但不干净。我希望有更好的方法-也许修改queryJson.nospace?