有没有办法将 GraphQL 查询字段分组到子/嵌套查询组中?

Posted

技术标签:

【中文标题】有没有办法将 GraphQL 查询字段分组到子/嵌套查询组中?【英文标题】:Is there a way to group GraphQL query fields into sub/nested query groups? 【发布时间】:2019-09-02 07:51:20 【问题描述】:

我正在使用 GraphQL-Java,而且我是 GraphQL 的新手。

我正在尝试找到一种方法来组织我的 API,就像在 GraphQL Hub 中所做的那样

基本上,我希望将我的 RootQuery 作为入口点(如 GraphQL Hub 中的 GraphQLHubAPI),然后是 GraphQL Hub 中的 Reddit、Github 等子组)

我对 RedditAPI 应该是什么以及我应该如何为其接线感到困惑。如果这是一个对象类型,它需要一个 DataFetcher 或某种方法来解析请求。在他们的架构中,他们将其公开为QueryObjectType(使用JS)

如何使用 GraphQL-Java 复制相同的结构?

【问题讨论】:

【参考方案1】:

你可以做的只是返回一个新的对象。由于默认的 PropertyDataFetcher 不会找到对象上的字段,它会移动到您的字段上声明的 DataFetcher:

RuntimeWiring.newRuntimeWiring()
                .type(newTypeWiring("RootQuery")
                        .dataFetcher("RedditAPI", (environment) -> new Object())
                )
                .type(newTypeWiring("RedditAPI")
                        .dataFetcher("users", usersDataFetcher)
                        .dataFetcher("subreddits", subredditsDataFetcher)
                )
                .build();

【讨论】:

【参考方案2】:

显然,答案是使用一个数据获取器,它为“子组”对象返回一个虚拟对象。这将为您的叶子创建“路径”。你可以处理接线中的叶子

例如,对于 Reddit 场景,您可以使用这样的架构

schema 
    query: RootQuery


type RootQuery 
    RedditAPI: RedditAPI


type RedditAPI 
    users: [Users]
    subreddits(name: String!): [subreddit]

然后像这样连接起来

RuntimeWiring.newRuntimeWiring()
                .type(newTypeWiring("RootQuery")
                        .dataFetcher("RedditAPI", new DataFetcher() 
                            @Override
                            public Object get(DataFetchingEnvironment dataFetchingEnvironment) 
                                return RedditAPI.newBuilder().build();
                            
                        )
                )
                .type(newTypeWiring("RedditAPI")
                        .dataFetcher("users", usersDataFetcher)
                        .dataFetcher("subreddits", subredditsDataFetcher)
                )
                .build();

【讨论】:

以上是关于有没有办法将 GraphQL 查询字段分组到子/嵌套查询组中?的主要内容,如果未能解决你的问题,请参考以下文章

在 GraphQL 中将参数从根传递到子查询

GraphQL 中的分组查询(不是“分组依据”)

有没有办法将 Java 服务器中的 GraphQL 查询转换为 SPARQL 查询?

GraphQL SPQR - 如何获取客户端使用查询请求的字段列表

使用 Apollo Federated GraphQL,有没有办法对来自外部实体的值进行排序/分页?

使用接口构建 graphql 查询