1

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

1 回答 1

0

我不得不手动删除 \" 和 \\n 从

“查询 FetchPokemons($height: Int) {\n pokemonsWithHeight(height: $height) {\n name\n }\n}”

查询 FetchPokemons($height: Int) { pokemonsWithHeight(height: $height) { name }}

进入解析器使用

def formatQuery(s: String): String = s.replaceAllLiterally("\\n","").replaceAllLiterally("\"", "")

这个解决方案简单但不干净。我希望有更好的方法 - 也许修改 queryJson.nospace?

于 2018-07-23T18:53:01.110 回答