Средство распознавания нескольких полей разрешает один и тот же API остальных с различными параметрами запроса - PullRequest
0 голосов
/ 16 мая 2019

Мы планируем использовать graphql для оркестровок (например, пользовательский интерфейс клиента вызывает сервис graphql, который переходит к множественной конечной точке покоя и возвращает результат).Проблема здесь в том, что с одной конечной точки отдыха мы должны передавать различные типы параметров запроса в зависимости от поля, запрашиваемого нашим клиентом.

Мы используем библиотеки spring-boot-graphql и graphql-java-tools для инициализации graphql

type Query{
  user(id: ID): User
}

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

type Phone{...}
type Address{...}

Мой код разрешает пользовательское поле и вызывает конечную точку отдыха для получения информации о телефоне и адресе за один вызов, например https: restservice.com \ v1 \ user \ 123? Fields = phone, address

Как разрешить два поля, ожидающие данные от одного и того же сервиса отдыха.Я хочу что-то вроде, когда запрос клиента на телефон, то мне нужно отправить поля в параметрах запроса как телефон без адреса.Можем ли мы сделать это?или есть какой-то другой способ определения схемы для решения этой проблемы?

1 Ответ

0 голосов
/ 20 мая 2019
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 / документация / v12 / fieldselection /

...