GraphQL SPQR - Как получить список полей, запрошенных клиентом, с помощью запроса

Есть ли способ получить список полей, запрошенных клиентом в запросе GraphQL?

Предположим, у меня есть следующие типы:

type Book {

  isbn: String
  title: String
  genre: String
  author: Author
}

type Author {

  name: String
  surname: String
  age: Int
}

Есть ли способ на стороне Java внутри метода, аннотированного @GraphQLQuery, чтобы узнать, какие поля были запрошены клиентом?

Например, имея следующие запросы:

query {

  book ( isbn = "12345" ) {
  
    title
    genre
  }
}

query {

  book ( isbn = "12345" ) {
  
    title
    author {
    
      name
      surname
    }
  }
}

Я могу знать, что первый запрос запросил название полей и жанр книги, а второй требуемый заголовок из книги, а также имя и фамилию автора?

Спасибо, Массимо.


person Massimo Da Ros    schedule 07.05.2020    source источник


Ответы (1)


Вы можете получить эту информацию через @GraphQLEnvironment. Если вам просто нужны непосредственные подполя, вы можете ввести такие имена:

@GraphQLQuery
public Book book(String isbn, @GraphQLEnvironment Set<String> subfields) {
    ...
}

Если вам нужны все подполя или другая информация о выборе, вы можете ввести ResolutionEnvironment и получить оттуда DataFetcherEnvironment. Это, в свою очередь, дает вам доступ ко всему SelectionSet.

@GraphQLQuery
public Book book(String isbn, @GraphQLEnvironment ResolutionEnvironment env) {
    DataFetchingFieldSelectionSet selection = env.dataFetchingEnvironment.getSelectionSet();
     ...
}
person kaqqao    schedule 08.05.2020
comment
Спасибо @kaqqao, это работает! Мое намерение состояло в том, чтобы извлечь необходимые поля для построения графиков динамических сущностей и использовать их с базовой БД, выполняющей только необходимые соединения в зависимости от того, что хочет клиент. У меня уже есть реализация :) - person Massimo Da Ros; 09.05.2020
comment
Мне было бы интересно увидеть это в действии, если есть чем поделиться :) - person kaqqao; 09.05.2020
comment
Вот репозиторий Github (только учебный POC для изучения возможностей GraphQL): github. com/m-daros/graphql-spring-boot. Вы можете найти код, основанный на ваших подсказках, в этом классе: github.com/m-daros/graphql-spring-boot/blob/master/src/main/. :). Вы можете запустить приложение и выполнить запрос, используя графический интерфейс localhost:8080/gui. - person Massimo Da Ros; 09.05.2020