在 Java 中美化 GraphQL 查询字符串

Prettify GraphQL query string in Java

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

如您所知,单行查询,尤其是长查询,对人不友好且难以阅读。到处都有很多代码 formatters/prettifyers,在线的,IDEA 内部的,Postman,Insomnia 等,所有这些都可以通过单击按钮来完成。

工作 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' 字符串进行格式化。有没有 'prettification' 库,或者我应该写自定义符号 'remover'?

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