Apollo GraphQL - можно ли сделать один и тот же запрос, запрашивая разные поля? - PullRequest
0 голосов
/ 08 марта 2019

Я использую apollo-android , и я хочу знать, возможно ли использовать следующий подход:

Я определил запрос с именем locations в schema.jsonмоего сервера.Он определяется следующим образом:

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

Попытка этого запроса на игровой площадке работает отлично, и он возвращает континенты, страны и США.Это запрос, который я определяю на игровой площадке:

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

И, конечно, если я запрашиваю только континенты очереди, он возвращает только континенты:

query getLocations {
  locations {
    continents {
      name
      code
    }
}

Мой вопрос:Можно сделать то же самое в клиентской части.Когда я определяю запрос в файле api.graphql моего проекта Android, я делаю его так:

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);
            }
        });

Есть способ сделать тот же вызов, но определив, что я хочу, чтобы континенты, страны и США были только континентами?

Заранее спасибо!

1 Ответ

1 голос
/ 09 марта 2019

Спецификация гласит:

Базовая спецификация GraphQL включает ровно две директивы, которые должны поддерживаться любой спецификацией реализации сервера GraphQL:

  • @ include (if: Boolean) Включать это поле в результат только в том случае, если аргумент равен true.
  • @ skip (if: Boolean) Пропустить этополе, если аргумент равен true.

api.graphql с директивой пропуска:

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

Очевидно, вам нужно будет указать значение continentsOnly

...