多个字段解析器使用不同的查询参数解析相同的 REST API

Posted

技术标签:

【中文标题】多个字段解析器使用不同的查询参数解析相同的 REST API【英文标题】:Multiple field resolver resolves same rest API with different query parameters 【发布时间】:2019-10-03 08:37:42 【问题描述】:

我们计划使用 graphql 进行编排(例如,UI 客户端调用 graphql 服务,该服务转到多个休息端点并返回结果)。这里的问题是来自一个休息端点,我们必须根据客户端请求的字段传递不同类型的查询参数。

我们使用 spring-boot-graphql 和 graphql-java-tools 库来初始化 graphql

type Query
  user(id: ID): User


type User
 phone: [Phone]
 address: [Address]


type Phone...
type Address...

我的代码解析用户字段并调用 rest 端点以在单个调用中获取电话和地址信息,例如 https:restservice.com\v1\user\123?fields=phone,address

如何解析两个期望来自同一休息服务的数据的字段。我想要像客户端请求电话时那样的东西,然后我需要将请求参数中的字段作为电话单独发送而没有地址。我们可以这样做吗?或者有没有其他方法来定义模式来解决这个问题?

【问题讨论】:

【参考方案1】:
query 
    user(userId : "xyz")  
        name
        age
        weight
        friends 
            name
        
    

了解字段选择集有助于提高 DataFetchers 的效率。例如,在上面的查询中,假设用户字段由 SQL 数据库系统支持。数据获取器可以提前查看字段选择集并使用不同的查询,因为它知道调用者需要朋友信息以及用户信息。

    DataFetcher smartUserDF = new DataFetcher() 
        @Override
        public Object get(DataFetchingEnvironment env) 
            String userId = env.getArgument("userId");

            DataFetchingFieldSelectionSet selectionSet = env.getSelectionSet();
            if (selectionSet.contains("user/*")) 
                return getUserAndTheirFriends(userId);
             else 
                return getUser(userId);
            
        
    ;

https://www.graphql-java.com/documentation/v12/fieldselection/

【讨论】:

以上是关于多个字段解析器使用不同的查询参数解析相同的 REST API的主要内容,如果未能解决你的问题,请参考以下文章

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询

whoosh MultifieldParser 字段搜索或查询解析器连接

Solr查询解析器大全

使用 buildSchema 时如何访问字段解析器中父解析器的值?

Apollo 客户端解析器仅触发一次

Apollo GraphQL:未在突变子字段上调用解析器