在Java中美化GraphQL查询字符串

时间:2019-10-14 13:41:03

标签: java formatting graphql graphql-java

我有一个Java程序,除其他事项外,该程序从XML文件读取原始GraphQL查询,并将其通过HTTP发送到给定的端点。问题在于服务器仅接受格式正确的GraphQL查询,这意味着不允许有多余的空格,换行符等。因此,基本上我必须将它们写在一行中,因为任何换行符都会通过添加大量空格来匹配XML层次结构(包含查询的元素不是根元素)来破坏整个查询。

如您所知,单行查询(特别是长查询)不是人类友好的并且很难阅读。在线,IDEA,邮递员,失眠症等在线中有很多代码格式化程序/修饰符,所有这些都可以通过单击一个按钮来完成。

有效的XML文件(单行查询):

<request>
    <url>http://localhost:8080/graphql</url>
    <type>GRAPHQL</type>
    <body>mutation { login(input: {username: \"user\", password: \"12345\"}) {status}}</body>
</request>

所需的XML文件(多行查询):

<request>
    <url>http://localhost:8080/graphql</url>
    <type>GRAPHQL</type>
    <body>
        mutation {
          login(input: {username: "user", password: "12345"}) {
            status
          }
        }
    </body>
</request>

我该如何处理这种情况?发送之前,我应该对'body'字符串进行格式化。是否有任何“整理”库,还是我应该编写自定义符号“删除”?

1 个答案:

答案 0 :(得分:0)

graphql-java已经附带AstPrinter,可以漂亮地打印GraphQL AST节点。因此,您可以先将查询字符串转换为AST节点,然后使用它来美化查询字符串:

 String gql = "mutation { login(input: {username: \"user\", password: \"12345\"}) {status}}";
 Parser parser = new Parser();
 Document doc = parser.parseDocument(gql);
 System.out.println(AstPrinter.printAst(doc)); //which should print out a prettified query here