Apollo GraphQL - 是不是可以执行请求不同字段的相同查询?

Posted

技术标签:

【中文标题】Apollo GraphQL - 是不是可以执行请求不同字段的相同查询?【英文标题】:Apollo GraphQL - Is it possible to do the same query requesting different fields?Apollo GraphQL - 是否可以执行请求不同字段的相同查询? 【发布时间】:2019-07-30 16:47:51 【问题描述】:

我正在使用apollo-android,我想知道是否可以执行以下方法:

我在我的服务器的schema.json 中定义了一个名为locations 的查询。它是这样定义的:

type locations 
  continents: [Continent!],
  countries: [Country!],
  usaStates: [UsaState!]

在 Playground 中尝试此查询非常有效,它会返回大陆、国家和 usaStates。这是我在 Playground 中定义的查询:

query getLocations 
  locations 
    continents 
      name
      code
    
    countries 
      name
      code
    
    usaStates 
      code
      name
    
  

当然,如果我只请求 que 大陆,它只会返回大陆:

query getLocations 
  locations 
    continents 
      name
      code
    

我的问题是是否可以在客户端部分做同样的事情。当我在我的 Android 项目的 api.graphql 文件中定义查询时,我会这样做:

query getLocations 
  locations 
    continents 
      name
      code
    
    countries 
      code
      name
    
    usaStates 
      code
      name
    
  

然后,当我在代码中调用它时,结果包含大洲、国家和 usaStates:

GetLocationsQuery builder = GetLocationsQuery.builder().build();

api.query(builder)
    .enqueue(new ApolloCall.Callback<GetLocationsQuery.Data>() 
            @Override
            public void onResponse(@NotNull com.apollographql.apollo.api.Response<GetLocationsQuery.Data> response) 
                apiListener.onFinish(response);
            

            @Override
            public void onFailure(@NotNull ApolloException e) 
                Log.v("APOLLO", e.toString());
                apiListener.onError(e);
            
        );

有一种方法可以进行相同的调用,但定义我只想要大陆而不是大陆、国家和 usaStates?

提前谢谢你!

【问题讨论】:

【参考方案1】:

The specification 说:

核心 GraphQL 规范正好包括两个指令,它们 必须由任何符合规范的 GraphQL 服务器实现支持:

@include(如果:布尔值)仅当参数为真时才在结果中包含该字段。 @skip(如果:布尔值)如果参数为真,则跳过此字段。

api.graphql 带有跳过指令:

query getLocations($continentsOnly: Boolean) 
  locations 
    continents 
      name
      code
    
    countries @skip(if: $continentsOnly) 
      code
      name
    
    usaStates @skip(if: $continentsOnly) 
      code
      name
    
  

显然,您需要指定continentsOnly 的值

【讨论】:

谢谢!它完美无缺!只有一件事我必须更改您的代码。我收到 GraphQL 验证失败,因为变量 $continentsOnly 未初始化。所以最后我不得不这样称呼它: query getLocations($continentsOnly: Boolean = true) ...

以上是关于Apollo GraphQL - 是不是可以执行请求不同字段的相同查询?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apollo 和 GraphQL 缓存而不是 Vuex?

Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)

Apollo GraphQL:增强而不是覆盖默认解析器行为

NextJS 中的 Apollo 分页

GraphQL、react-apollo、Apollo 1,全局处理 200 HTTP 代码状态的 data.error 错误。不是网络一。

使用 graphql-code-generator 生成 React/Apollo 钩子时,数组类型是不是不正确?