桑格利亚汽酒简单graphQL查询,但语法错误

时间:2018-07-23 17:15:45

标签: graphql sangria

我正在尝试使用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
}

1 个答案:

答案 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?