【问题标题】: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?

提前谢谢你!

【问题讨论】:

    标签: android graphql apollo apollo-client apollo-android


    【解决方案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) { ... }
    猜你喜欢
    • 2017-10-31
    • 2019-05-25
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多